azerai-plugins-reminder 5.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 AzerStudio Dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,105 @@
1
+ Metadata-Version: 2.4
2
+ Name: azerai-plugins-reminder
3
+ Version: 5.0.0
4
+ Summary: **AzerAI Reminder Plugin** - Xatırladıcı Plugin
5
+ Author-email: AzStudio Dev <Info.AzerStudioDev@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder
8
+ Project-URL: Repository, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder.git
9
+ Project-URL: Bug Tracker, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/issues
10
+ Keywords: azerai,plugins,ai,azerbaijani,reminder
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.8
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Operating System :: Microsoft :: Windows
22
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
23
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 11
24
+ Classifier: Operating System :: POSIX :: Linux
25
+ Classifier: Operating System :: MacOS
26
+ Classifier: Operating System :: MacOS :: MacOS X
27
+ Requires-Python: >=3.8
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: livekit-agents
31
+ Requires-Dist: apscheduler
32
+ Dynamic: license-file
33
+
34
+ # 📅 AzerAI Reminder Plugin
35
+
36
+ **AzerAI** - Azərbaycan dilində qabaqcıl səsli AI asistent xatırladıcı üçün plugin
37
+
38
+ ## Xüsusiyyətlər
39
+
40
+ - ⏰ **Zamanlı xatırladıcılar** - Specific tarix və saatda
41
+ - 📅 **Günlük xatırladıcılar** - Hər gün təkrar olunan
42
+ - ⏸️ **Pause/Resume** - Xatırladıcıları idarə et
43
+ - 🗑️ **Sil** - Artıq lazım olmayanları sil
44
+ - 💾 **JSON saxlama** - Məlumatlar lokal olaraq saxlanılır
45
+ - 🔄 **APScheduler** - Güclü zamanlayıcı sistemi
46
+
47
+ ## Platform Dəstəyi
48
+
49
+ - 💻 **Windows** - Windows 10/11 dəstəklənir
50
+ - 🍎 **macOS** - macOS 10.15+ dəstəklənir
51
+ - 🐧 **Linux** - Ubuntu, CentOS, Debian dəstəklənir
52
+ - 🐍 **Python** - Python 3.8+ tələb olunur
53
+
54
+ ## Quraşdırma
55
+
56
+ ```bash
57
+ pip install AzerAI-Plugins-Reminder
58
+ ```
59
+
60
+ ## İstifadə
61
+
62
+ Plugin avtomatik olaraq AzerAI tərəfindən aşkar edilir.
63
+
64
+ ### Əmrlər
65
+
66
+ - `"5 dəqiqə sonra mənə xatırlat"` - Vaxtlı xatırladıcı
67
+ - `"Hər gün saat 09:00da mənə xatırlat"` - Günlük xatırladıcı
68
+ - `"Xatırladıcılarmı göstər"` - Siyahı
69
+ - `"X xatırladıcınızı dayandırın"` - Pause
70
+ - `"X xatırladıcınızı davam et"` - Resume
71
+ - `"X xatırladıcınızı sil"` - Sil
72
+
73
+ ## Fayl struktur
74
+
75
+ ```
76
+ azerai_plugins_reminder/
77
+ ├── __init__.py
78
+ ├── info.py
79
+ ├── main.py
80
+ └── prompts.py
81
+ ```
82
+
83
+ ## Fayllar
84
+
85
+ - `azerai_reminders.json` - Xatırladıcı məlumatları
86
+
87
+ ## Asılılıqlar
88
+
89
+ - `livekit-agents` - AI agent framework
90
+ - `apscheduler` - Zamanlayıcı
91
+
92
+ ## 📄 Lisenziya
93
+
94
+ Bu layihə MIT Lisenziyası ilə lisenziyalaşdırılıb - [LICENSE](https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/blob/main/LICENSE) faylına baxın.
95
+
96
+ ## 📞 Əlaqə
97
+
98
+ - **Müəllif:** AzerStudio Dev
99
+ - **Email:** Info.AzerStudioDev@gmail.com
100
+ - **GitHub:** https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder
101
+ - **PyPI:** https://pypi.org/project/AzerAI-Plugins-Reminder/
102
+
103
+ ---
104
+
105
+ **🇦🇿 Azərbaycanın ilk tam plugin ekosistemli AI asistentinin Reminder plugini!** 🚀
@@ -0,0 +1,72 @@
1
+ # 📅 AzerAI Reminder Plugin
2
+
3
+ **AzerAI** - Azərbaycan dilində qabaqcıl səsli AI asistent xatırladıcı üçün plugin
4
+
5
+ ## Xüsusiyyətlər
6
+
7
+ - ⏰ **Zamanlı xatırladıcılar** - Specific tarix və saatda
8
+ - 📅 **Günlük xatırladıcılar** - Hər gün təkrar olunan
9
+ - ⏸️ **Pause/Resume** - Xatırladıcıları idarə et
10
+ - 🗑️ **Sil** - Artıq lazım olmayanları sil
11
+ - 💾 **JSON saxlama** - Məlumatlar lokal olaraq saxlanılır
12
+ - 🔄 **APScheduler** - Güclü zamanlayıcı sistemi
13
+
14
+ ## Platform Dəstəyi
15
+
16
+ - 💻 **Windows** - Windows 10/11 dəstəklənir
17
+ - 🍎 **macOS** - macOS 10.15+ dəstəklənir
18
+ - 🐧 **Linux** - Ubuntu, CentOS, Debian dəstəklənir
19
+ - 🐍 **Python** - Python 3.8+ tələb olunur
20
+
21
+ ## Quraşdırma
22
+
23
+ ```bash
24
+ pip install AzerAI-Plugins-Reminder
25
+ ```
26
+
27
+ ## İstifadə
28
+
29
+ Plugin avtomatik olaraq AzerAI tərəfindən aşkar edilir.
30
+
31
+ ### Əmrlər
32
+
33
+ - `"5 dəqiqə sonra mənə xatırlat"` - Vaxtlı xatırladıcı
34
+ - `"Hər gün saat 09:00da mənə xatırlat"` - Günlük xatırladıcı
35
+ - `"Xatırladıcılarmı göstər"` - Siyahı
36
+ - `"X xatırladıcınızı dayandırın"` - Pause
37
+ - `"X xatırladıcınızı davam et"` - Resume
38
+ - `"X xatırladıcınızı sil"` - Sil
39
+
40
+ ## Fayl struktur
41
+
42
+ ```
43
+ azerai_plugins_reminder/
44
+ ├── __init__.py
45
+ ├── info.py
46
+ ├── main.py
47
+ └── prompts.py
48
+ ```
49
+
50
+ ## Fayllar
51
+
52
+ - `azerai_reminders.json` - Xatırladıcı məlumatları
53
+
54
+ ## Asılılıqlar
55
+
56
+ - `livekit-agents` - AI agent framework
57
+ - `apscheduler` - Zamanlayıcı
58
+
59
+ ## 📄 Lisenziya
60
+
61
+ Bu layihə MIT Lisenziyası ilə lisenziyalaşdırılıb - [LICENSE](https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/blob/main/LICENSE) faylına baxın.
62
+
63
+ ## 📞 Əlaqə
64
+
65
+ - **Müəllif:** AzerStudio Dev
66
+ - **Email:** Info.AzerStudioDev@gmail.com
67
+ - **GitHub:** https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder
68
+ - **PyPI:** https://pypi.org/project/AzerAI-Plugins-Reminder/
69
+
70
+ ---
71
+
72
+ **🇦🇿 Azərbaycanın ilk tam plugin ekosistemli AI asistentinin Reminder plugini!** 🚀
@@ -0,0 +1,22 @@
1
+ """
2
+ AzerAI Reminder Plugin - Paketin Giriş Nöqtəsi Və Export Olunan Funksiyalar
3
+ """
4
+ from .main import (
5
+ create_reminder,
6
+ create_daily_reminder,
7
+ list_reminders,
8
+ delete_reminder,
9
+ pause_reminder,
10
+ resume_reminder,
11
+ reminder_tools
12
+ )
13
+
14
+ __all__ = [
15
+ "create_reminder",
16
+ "create_daily_reminder",
17
+ "list_reminders",
18
+ "delete_reminder",
19
+ "pause_reminder",
20
+ "resume_reminder",
21
+ "reminder_tools"
22
+ ]
@@ -0,0 +1,9 @@
1
+ """
2
+ AzerAI Reminder Plugin - Plugin Haqqında Məlumatlar Və Metadata
3
+ """
4
+ PLUGIN_INFO = {
5
+ "name": "azerai-plugins-reminder",
6
+ "version": "5.0.0",
7
+ "author": "AzerStudio Dev",
8
+ "description": "AzerAI Reminder Plugin - Xatırladıcı Plugin"
9
+ }
@@ -0,0 +1,448 @@
1
+ """
2
+ AzerAI Reminder Plugin - Xatırladıcı Alətləri
3
+ """
4
+ import logging
5
+ import json
6
+ from datetime import datetime
7
+ from typing import Dict, Any
8
+ from pathlib import Path
9
+ from livekit.agents import function_tool, RunContext
10
+
11
+ # APScheduler idxalı
12
+ try:
13
+ from apscheduler.schedulers.background import BackgroundScheduler
14
+ from apscheduler.triggers.date import DateTrigger
15
+ from apscheduler.triggers.interval import IntervalTrigger
16
+ from apscheduler.triggers.cron import CronTrigger
17
+ APSCHEDULER_AVAILABLE = True
18
+ except ImportError:
19
+ APSCHEDULER_AVAILABLE = False
20
+ print("[NO] APScheduler tapılmadı! Xatırlatma sistemi işləməz. Zəhmət olmasa 'pip install apscheduler' əmrini işə salın.")
21
+
22
+ logger = logging.getLogger("AzerAI-Plugins-Reminder")
23
+
24
+ class ReminderTools:
25
+ def __init__(self):
26
+ self.reminders_file = Path("azerai_reminders.json")
27
+ self.active_reminders: Dict[str, Dict[str, Any]] = {}
28
+ self.session_ref = None
29
+ self.loop_ref = None
30
+ self.running = True
31
+
32
+ # APScheduler quraşdırması
33
+ if APSCHEDULER_AVAILABLE:
34
+ self.scheduler = BackgroundScheduler()
35
+ self.scheduler.start()
36
+ logger.info("APScheduler başladıldı")
37
+ else:
38
+ self.scheduler = None
39
+ logger.error("APScheduler tapılmadı! Xatırlatma sistemi işləməyə bilər.")
40
+ print("[NO] APScheduler tapılmadı! Zəhmət olmasa 'pip install apscheduler' əmrini işə salın.")
41
+ return
42
+
43
+ # Faylı yüklə
44
+ self._load_reminders()
45
+
46
+ # Mövcud xatırlatmaları planlaşdır
47
+ self._schedule_existing_reminders()
48
+
49
+ def _schedule_existing_reminders(self):
50
+ """Mövcud xatırlatmaları APScheduler ilə planlaşdır"""
51
+ if not self.scheduler:
52
+ return
53
+
54
+ for reminder_id, reminder in self.active_reminders.items():
55
+ if reminder.get('active', True) and not reminder.get('paused', False):
56
+ self._schedule_reminder(reminder_id, reminder)
57
+
58
+ def _schedule_reminder(self, reminder_id: str, reminder: Dict[str, Any]):
59
+ """Tək bir xatırlatmanı planlaşdır"""
60
+ if not self.scheduler:
61
+ return
62
+
63
+ try:
64
+ # Köhnə job varsa sil
65
+ job_id = f"reminder_{reminder_id}"
66
+ if self.scheduler.get_job(job_id):
67
+ self.scheduler.remove_job(job_id)
68
+
69
+ # Gündəlik xatırlatma
70
+ if reminder.get('daily', False):
71
+ time_parts = reminder['time'].split(':')
72
+ hour, minute = int(time_parts[0]), int(time_parts[1])
73
+ self.scheduler.add_job(
74
+ func=self._trigger_reminder_job,
75
+ trigger=CronTrigger(hour=hour, minute=minute),
76
+ args=[reminder_id, reminder],
77
+ id=job_id,
78
+ replace_existing=True
79
+ )
80
+ logger.info(f"Gündəlik xatırlatma planlaşdırıldı: {reminder_id} saat {reminder['time']}")
81
+
82
+ # Müəyyən tarix/vaxt
83
+ elif 'datetime' in reminder:
84
+ reminder_time = datetime.fromisoformat(reminder['datetime'])
85
+ self.scheduler.add_job(
86
+ func=self._trigger_reminder_job,
87
+ trigger=DateTrigger(run_date=reminder_time),
88
+ args=[reminder_id, reminder],
89
+ id=job_id,
90
+ replace_existing=True
91
+ )
92
+ logger.info(f"Tarixli xatırlatma planlaşdırıldı: {reminder_id} vaxt {reminder_time}")
93
+
94
+ # Nisbi vaxt
95
+ elif 'relative_time' in reminder:
96
+ seconds = reminder['relative_time']
97
+ self.scheduler.add_job(
98
+ func=self._trigger_reminder_job,
99
+ trigger=IntervalTrigger(seconds=seconds),
100
+ args=[reminder_id, reminder],
101
+ id=job_id,
102
+ replace_existing=True
103
+ )
104
+ logger.info(f"Nisbi xatırlatma planlaşdırıldı: {reminder_id} {seconds}s sonra")
105
+
106
+ except Exception as e:
107
+ logger.error(f"Xatırlatma planlaşdırma xətası {reminder_id}: {e}")
108
+
109
+ def _trigger_reminder_job(self, reminder_id: str, reminder: Dict[str, Any]):
110
+ """APScheduler job-dan çağırılan xatırlatma funksiyası"""
111
+ try:
112
+ self._trigger_reminder(reminder_id, reminder)
113
+
114
+ # Tək dəfəlik xatırlatmaları deaktiv et (gündəliklər istisna)
115
+ if not reminder.get('daily', False):
116
+ if reminder_id in self.active_reminders:
117
+ self.active_reminders[reminder_id]['active'] = False
118
+ self.active_reminders[reminder_id]['triggered_at'] = datetime.now().isoformat()
119
+ self._save_reminders()
120
+
121
+ # Job-u sil
122
+ job_id = f"reminder_{reminder_id}"
123
+ if self.scheduler.get_job(job_id):
124
+ self.scheduler.remove_job(job_id)
125
+
126
+ # Gündəlik xatırlatmalar üçün son tətiklənmə tarixini yenilə
127
+ elif reminder.get('daily', False):
128
+ if reminder_id in self.active_reminders:
129
+ self.active_reminders[reminder_id]['last_triggered'] = datetime.now().date().isoformat()
130
+ self._save_reminders()
131
+
132
+ except Exception as e:
133
+ logger.error(f"Xatırlatma job xətası {reminder_id}: {e}")
134
+
135
+ def _load_reminders(self):
136
+ """JSON faylından xatırlatmaları yüklə"""
137
+ try:
138
+ if self.reminders_file.exists():
139
+ with open(self.reminders_file, 'r', encoding='utf-8') as f:
140
+ data = json.load(f)
141
+ self.active_reminders = data.get('reminders', {})
142
+ logger.info(f"{len(self.active_reminders)} xatırlatma fayldan yükləndi")
143
+ else:
144
+ # Boş fayl yarat
145
+ self._save_reminders()
146
+ except Exception as e:
147
+ logger.error(f"Xatırlatmalar yüklənmə xətası: {e}")
148
+ self.active_reminders = {}
149
+
150
+ def _save_reminders(self):
151
+ """Xatırlatmaları JSON faylına saxla"""
152
+ try:
153
+ data = {
154
+ 'reminders': self.active_reminders,
155
+ 'last_updated': datetime.now().isoformat()
156
+ }
157
+ with open(self.reminders_file, 'w', encoding='utf-8') as f:
158
+ json.dump(data, f, ensure_ascii=False, indent=2)
159
+ logger.info("Xatırlatmalar fayla saxlandı")
160
+ except Exception as e:
161
+ logger.error(f"Xatırlatmalar saxlama xətası: {e}")
162
+
163
+ def _trigger_reminder(self, reminder_id: str, reminder: Dict[str, Any]):
164
+ """Xatırlatmanı tətiklə və bildiriş göndər"""
165
+ title = reminder.get('title', 'Xatırlatma')
166
+ message = reminder.get('message', f'⏰ Xatırlatma: {title}')
167
+
168
+ logger.info(f"=== XATIRLATMA TƏTİKLƏNDİ: {reminder_id} - '{title}' ===")
169
+ print(f"[OK] XATIRLATMA: {title}")
170
+
171
+ # Session-a bildiriş göndər
172
+ if self.session_ref and self.loop_ref:
173
+ try:
174
+ print(f"[OK] DEBUG: Session-a xatırlatma bildirişi göndərməyə cəhd edilir...")
175
+ print(f"[OK] DEBUG: Session var: {self.session_ref is not None}")
176
+ print(f"[OK] DEBUG: Loop var: {self.loop_ref is not None}")
177
+
178
+ # Daxili köməkçi funksiya təyin et
179
+ async def send_reminder_notification():
180
+ try:
181
+ print(f"[OK] SESSION'A GÖNDƏRİLİR: Xatırlatma: {title} müddəti bitdi!")
182
+ await self.session_ref.generate_reply(
183
+ instructions=f"role: assistant | content: {message} bunu istifadəçiyə deyin: Bu xatırlatma tətikləndi və artıq deaktiv."
184
+ )
185
+ print(f"[OK] SESSION'A UĞURLA GÖNDƏRİLDİ: {title}")
186
+ except Exception as e:
187
+ print(f"[NO] SESSION'A GÖNDƏRİLMƏDİ: {e}")
188
+
189
+ future = __import__('asyncio').run_coroutine_threadsafe(
190
+ send_reminder_notification(),
191
+ self.loop_ref
192
+ )
193
+ print(f"[OK] DEBUG: Xatırlatma future yaradıldı: {future}")
194
+ logger.info(f"Xatırlatma bildirişi göndərildi: {title}")
195
+ except Exception as e:
196
+ logger.error(f"Xatırlatma bildirişi göndərilmədi: {e}")
197
+ print(f"[NO] SESSION'A GÖNDƏRİLMƏDİ: {e}")
198
+ else:
199
+ print(f"[OK] DEBUG: Session-a göndərə bilmirəm - session və ya loop çatışmır")
200
+ print(f"[OK] DEBUG: Session var: {self.session_ref is not None}")
201
+ print(f"[OK] DEBUG: Loop var: {self.loop_ref is not None}")
202
+ logger.warning(f"'{title}' xatırlatması üçün session referansı yoxdur")
203
+
204
+ def update_session_reference(self, ctx: RunContext):
205
+ """Session referansını yenilə"""
206
+ if not self.session_ref:
207
+ self.session_ref = ctx.session
208
+ self.loop_ref = __import__('asyncio').get_running_loop()
209
+ logger.info("Xatırlatmalar üçün session referansı yeniləndi")
210
+ print("[OK] Session referansı xatırlatma sistemi üçün yeniləndi")
211
+
212
+ @function_tool()
213
+ async def create_daily_reminder(self, ctx: RunContext, title: str, time_str: str, message: str = ""):
214
+ """Gündəlik xatırlatma yarat."""
215
+ self.update_session_reference(ctx)
216
+
217
+ reminder_id = f"reminder_{len(self.active_reminders) + 1}"
218
+
219
+ try:
220
+ datetime.strptime(time_str, "%H:%M")
221
+ except ValueError:
222
+ return """Yanlış vaxt formatı. 'SS:DD' istifadə edin."""
223
+
224
+ reminder_data = {
225
+ 'title': title,
226
+ 'message': message or f'📅 Gündəlik: {title}',
227
+ 'created_at': datetime.now().isoformat(),
228
+ 'active': True,
229
+ 'daily': True,
230
+ 'time': time_str
231
+ }
232
+
233
+ self.active_reminders[reminder_id] = reminder_data
234
+ self._save_reminders()
235
+
236
+ # APScheduler ilə planlaşdır
237
+ self._schedule_reminder(reminder_id, reminder_data)
238
+
239
+ print(f"[OK] Gündəlik xatırlatma: '{title}' - {time_str}")
240
+ return f"Gündəlik xatırlatma '{title}' yaradıldı: {time_str}"
241
+
242
+ @function_tool()
243
+ async def create_reminder(self, ctx: RunContext, title: str, message: str = "",
244
+ datetime_str: str = "", hours: int = 0, minutes: int = 0, days: int = 0):
245
+ """Yeni xatırlatma yarat."""
246
+ self.update_session_reference(ctx)
247
+
248
+ reminder_id = f"reminder_{len(self.active_reminders) + 1}"
249
+
250
+ reminder_data = {
251
+ 'title': title,
252
+ 'message': message or f'⏰ Xatırlatma: {title}',
253
+ 'created_at': datetime.now().isoformat(),
254
+ 'active': True
255
+ }
256
+
257
+ if datetime_str:
258
+ try:
259
+ reminder_time = datetime.strptime(datetime_str, "%Y-%m-%d %H:%M")
260
+ reminder_data['datetime'] = reminder_time.isoformat()
261
+ time_desc = datetime_str
262
+ except ValueError:
263
+ return """Yanlış tarix formatı. 'İİİİ-AA-GG SS:DD' istifadə edin."""
264
+ else:
265
+ total_seconds = (days * 86400) + (hours * 3600) + (minutes * 60)
266
+ if total_seconds > 0:
267
+ reminder_data['relative_time'] = total_seconds
268
+ time_parts = []
269
+ if days > 0:
270
+ time_parts.append(f"{days} gün")
271
+ if hours > 0:
272
+ time_parts.append(f"{hours} saat")
273
+ if minutes > 0:
274
+ time_parts.append(f"{minutes} dəqiqə")
275
+ time_desc = " ".join(time_parts) + " sonra"
276
+ else:
277
+ return """Düzgün bir vaxt göstərin."""
278
+
279
+ self.active_reminders[reminder_id] = reminder_data
280
+ self._save_reminders()
281
+
282
+ # APScheduler ilə planlaşdır
283
+ self._schedule_reminder(reminder_id, reminder_data)
284
+
285
+ print(f"[OK] Xatırlatma: '{title}' - {time_desc}")
286
+ return f"Xatırlatma '{title}' yaradıldı: {time_desc}"
287
+
288
+ @function_tool()
289
+ async def list_reminders(self, ctx: RunContext):
290
+ """Bütün xatırlatmaları göstər."""
291
+ # Session referansını yenilə
292
+ self.update_session_reference(ctx)
293
+ reminders_list = []
294
+
295
+ for reminder_id, reminder in self.active_reminders.items():
296
+ # Vəziyyəti təyin et
297
+ if reminder.get('paused', False):
298
+ status = "⏸️ Dayandırılmış"
299
+ elif reminder.get('daily', False):
300
+ status = "📅 Gündəlik"
301
+ elif reminder.get('active', True):
302
+ status = "🟢 Aktif"
303
+ else:
304
+ status = "🔴 Deaktif"
305
+
306
+ title = reminder.get('title', 'Başlıqsız')
307
+
308
+ # Zaman məlumatını formatla
309
+ if reminder.get('daily', False) and 'time' in reminder:
310
+ time_info = f"Hər gün {reminder['time']}"
311
+ if reminder.get('last_triggered'):
312
+ time_info += f" (Son: {reminder['last_triggered']})"
313
+ elif 'datetime' in reminder:
314
+ time_info = f"Zaman: {reminder['datetime']}"
315
+ elif 'relative_time' in reminder:
316
+ seconds = reminder['relative_time']
317
+ hours = seconds // 3600
318
+ minutes = (seconds % 3600) // 60
319
+ time_info = f"Müddət: {hours}sa {minutes}dk"
320
+ else:
321
+ time_info = "Vaxt göstərilməyib"
322
+
323
+ reminders_list.append(f"{status} - {title} ({time_info})")
324
+
325
+ if reminders_list:
326
+ result = "\n".join(reminders_list)
327
+ print(f"[OK] XATIRLATMALAR:\n{result}")
328
+ return f"Xatırlatmalar:\n{result}"
329
+ else:
330
+ print("[OK] XATIRLATMA YOXDUR")
331
+ return "Xatırlatma tapılmadı"
332
+
333
+ @function_tool()
334
+ async def pause_reminder(self, ctx: RunContext, title: str):
335
+ """Xatırlatmanı dayandır."""
336
+ self.update_session_reference(ctx)
337
+
338
+ try:
339
+ paused_reminders = []
340
+
341
+ for reminder_id, reminder in self.active_reminders.items():
342
+ if reminder.get('title', '').lower() == title.lower() and reminder.get('active', True):
343
+ reminder['active'] = False
344
+ reminder['paused'] = True
345
+ reminder['paused_at'] = datetime.now().isoformat()
346
+ paused_reminders.append(reminder_id)
347
+
348
+ # APScheduler job-u sil
349
+ job_id = f"reminder_{reminder_id}"
350
+ if self.scheduler and self.scheduler.get_job(job_id):
351
+ self.scheduler.remove_job(job_id)
352
+
353
+ logger.info(f"=== XATIRLATMA DAYANDIRILDI: {reminder_id} - '{title}' ===")
354
+
355
+ if paused_reminders:
356
+ self._save_reminders()
357
+ print(f"[OK] Xatırlatma dayandırıldı: '{title}'")
358
+ return f"'{title}' xatırlatması uğurla dayandırıldı"
359
+ else:
360
+ print(f"[NO] Aktiv xatırlatma tapılmadı: '{title}'")
361
+ return f"'{title}' başlıqlı aktiv xatırlatma tapılmadı"
362
+ except Exception as e:
363
+ logger.error(f"Xatırlatma dayandırılarkən xəta: {e}")
364
+ return f"Xatırlatma dayandırılarkən xəta baş verdi: {str(e)}"
365
+
366
+ @function_tool()
367
+ async def resume_reminder(self, ctx: RunContext, title: str):
368
+ """Xatırlatmanı davam etdir."""
369
+ self.update_session_reference(ctx)
370
+
371
+ resumed_reminders = []
372
+
373
+ for reminder_id, reminder in self.active_reminders.items():
374
+ if reminder.get('title', '').lower() == title.lower() and reminder.get('paused', False):
375
+ # Vaxtı hesabla
376
+ if 'paused_at' in reminder and 'relative_time' in reminder:
377
+ paused_time = datetime.fromisoformat(reminder['paused_at'])
378
+ created_time = datetime.fromisoformat(reminder['created_at'])
379
+ elapsed = (paused_time - created_time).total_seconds()
380
+ remaining = reminder['relative_time'] - elapsed
381
+
382
+ if remaining > 0:
383
+ reminder['relative_time'] = remaining
384
+ reminder['created_at'] = datetime.now().isoformat()
385
+
386
+ reminder['active'] = True
387
+ reminder['paused'] = False
388
+ reminder.pop('paused_at', None)
389
+ resumed_reminders.append(reminder_id)
390
+
391
+ # APScheduler ilə yenidən planlaşdır
392
+ self._schedule_reminder(reminder_id, reminder)
393
+
394
+ logger.info(f"=== XATIRLATMA DAVAM ETTİRİLDİ: {reminder_id} - '{title}' ===")
395
+
396
+ if resumed_reminders:
397
+ self._save_reminders()
398
+ print(f"[OK] Xatırlatma davam etdirildi: '{title}'")
399
+ return f"'{title}' xatırlatması uğurla davam etdirildi"
400
+ else:
401
+ print(f"[NO] Dayandırılmış xatırlatma tapılmadı: '{title}'")
402
+ return f"'{title}' başlıqlı dayandırılmış xatırlatma tapılmadı"
403
+
404
+ @function_tool()
405
+ async def delete_reminder(self, ctx: RunContext, title: str):
406
+ """Xatırlatmanı sil."""
407
+ self.update_session_reference(ctx)
408
+ deleted_reminders = []
409
+
410
+ for reminder_id, reminder in list(self.active_reminders.items()):
411
+ if reminder.get('title', '').lower() == title.lower():
412
+ del self.active_reminders[reminder_id]
413
+ deleted_reminders.append(reminder_id)
414
+
415
+ # APScheduler job-u sil
416
+ job_id = f"reminder_{reminder_id}"
417
+ if self.scheduler and self.scheduler.get_job(job_id):
418
+ self.scheduler.remove_job(job_id)
419
+
420
+ logger.info(f"=== XATIRLATMA SİLİNDİ: {reminder_id} - '{title}' ===")
421
+
422
+ if deleted_reminders:
423
+ self._save_reminders()
424
+ print(f"[OK] Xatırlatma silindi: '{title}'")
425
+ return f"'{title}' xatırlatması uğurla silindi"
426
+ else:
427
+ print(f"[NO] Xatırlatma tapılmadı: '{title}'")
428
+ return f"'{title}' başlıqlı xatırlatma tapılmadı"
429
+
430
+ def __del__(self):
431
+ """Təmizləmə əməliyyatı"""
432
+ self.running = False
433
+ if self.scheduler:
434
+ try:
435
+ self.scheduler.shutdown()
436
+ logger.info("APScheduler söndürüldü")
437
+ except:
438
+ pass
439
+
440
+
441
+ # Qlobal nümunə
442
+ reminder_tools = ReminderTools()
443
+ create_reminder = reminder_tools.create_reminder
444
+ create_daily_reminder = reminder_tools.create_daily_reminder
445
+ list_reminders = reminder_tools.list_reminders
446
+ delete_reminder = reminder_tools.delete_reminder
447
+ pause_reminder = reminder_tools.pause_reminder
448
+ resume_reminder = reminder_tools.resume_reminder
@@ -0,0 +1,80 @@
1
+ """
2
+ AzerAI Reminder Plugin - Xatırladıcı Plugin AI Təlimatları
3
+ """
4
+ PLUGIN_PROMPT = """
5
+ Reminder Plugin Capability:
6
+ You can manage reminders using the reminder plugin. Users can create, list, pause, resume, delete reminders.
7
+
8
+ Available functions:
9
+ - create_reminder(title, message, datetime_str, hours, minutes, days) - Yeni xatırlatma yarat
10
+ - create_daily_reminder(title, time_str, message) - Gündəlik xatırlatma yarat
11
+ - list_reminders() - Bütün xatırlatmaları göstər
12
+ - pause_reminder(title) - Xatırlatmanı dayandır
13
+ - resume_reminder(title) - Xatırlatmanı davam etdir
14
+ - delete_reminder(title) - Xatırlatmanı sil
15
+
16
+ Function Details:
17
+
18
+ 1. create_reminder()
19
+ - Args:
20
+ * title (str): Xatırlatma başlığı
21
+ * message (str, optional): Xatırlatma mesajı
22
+ * datetime_str (str, optional): Tarix və saat (YYYY-MM-DD HH:MM formatında)
23
+ * hours (int, optional): Neçə saat sonra
24
+ * minutes (int, optional): Neçə dəqiqə sonra
25
+ * days (int, optional): Neçə gün sonra
26
+ - Returns: Str - Yaradılan xatırlatmanın təsdiqi
27
+
28
+ 2. create_daily_reminder()
29
+ - Args:
30
+ * title (str): Xatırlatma başlığı
31
+ * time_str (str): Vaxt (HH:MM formatında)
32
+ * message (str, optional): Xatırlatma mesajı
33
+ - Returns: Str - Yaradılan gündəlik xatırlatmanın təsdiqi
34
+
35
+ 3. list_reminders()
36
+ - Args: None
37
+ - Returns: Str - Bütün xatırlatmaların siyahısı
38
+
39
+ 4. pause_reminder()
40
+ - Args:
41
+ * title (str): Dayandırılacaq xatırlatmanın başlığı
42
+ - Returns: Str - Dayandırılma təsdiqi
43
+
44
+ 5. resume_reminder()
45
+ - Args:
46
+ * title (str): Davam etdiriləcək xatırlatmanın başlığı
47
+ - Returns: Str - Davam etdirilmə təsdiqi
48
+
49
+ 6. delete_reminder()
50
+ - Args:
51
+ * title (str): Silinəcək xatırlatmanın başlığı
52
+ - Returns: Str - Silinmə təsdiqi
53
+
54
+ When users ask about reminders, schedules, or tasks, use these functions to help them.
55
+
56
+ Examples:
57
+ - "Saat 5-də mənə xatıldat" -> Use create_reminder()
58
+ - "Bugün nə var?" -> Use list_reminders()
59
+ - "Tapşırığı tamamla" -> Use complete_reminder()
60
+ - "Xatırlatma sil" -> Use delete_reminder()
61
+ - "Statistikanı göstər" -> Use get_reminder_stats()
62
+
63
+ Reminder features:
64
+ - Time and date scheduling
65
+ - Priority levels (high, medium, low)
66
+ - Categories (work, personal, health, etc.)
67
+ - Completion tracking
68
+ - Azerbaijani language support
69
+
70
+ Common reminder commands:
71
+ - "Saat [vaxt]-da [mətn] xatıldat" - Create reminder
72
+ - "Bütün xatırlatmalar" - List reminders
73
+ - "[ID] nömrəli xatırlatmanı tamamla" - Complete reminder
74
+ - "[ID] nömrəli xatırlatmanı sil" - Delete reminder
75
+ - "Xatırlatma statistikası" - Get statistics
76
+
77
+ Always provide responses in Azerbaijani language unless specifically asked otherwise.
78
+ If there are any issues with reminder operations, inform the user politely with specific error details.
79
+ Use natural Azerbaijani language for all reminder-related interactions.
80
+ """
@@ -0,0 +1,105 @@
1
+ Metadata-Version: 2.4
2
+ Name: azerai-plugins-reminder
3
+ Version: 5.0.0
4
+ Summary: **AzerAI Reminder Plugin** - Xatırladıcı Plugin
5
+ Author-email: AzStudio Dev <Info.AzerStudioDev@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder
8
+ Project-URL: Repository, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder.git
9
+ Project-URL: Bug Tracker, https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/issues
10
+ Keywords: azerai,plugins,ai,azerbaijani,reminder
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.8
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Operating System :: Microsoft :: Windows
22
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
23
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 11
24
+ Classifier: Operating System :: POSIX :: Linux
25
+ Classifier: Operating System :: MacOS
26
+ Classifier: Operating System :: MacOS :: MacOS X
27
+ Requires-Python: >=3.8
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: livekit-agents
31
+ Requires-Dist: apscheduler
32
+ Dynamic: license-file
33
+
34
+ # 📅 AzerAI Reminder Plugin
35
+
36
+ **AzerAI** - Azərbaycan dilində qabaqcıl səsli AI asistent xatırladıcı üçün plugin
37
+
38
+ ## Xüsusiyyətlər
39
+
40
+ - ⏰ **Zamanlı xatırladıcılar** - Specific tarix və saatda
41
+ - 📅 **Günlük xatırladıcılar** - Hər gün təkrar olunan
42
+ - ⏸️ **Pause/Resume** - Xatırladıcıları idarə et
43
+ - 🗑️ **Sil** - Artıq lazım olmayanları sil
44
+ - 💾 **JSON saxlama** - Məlumatlar lokal olaraq saxlanılır
45
+ - 🔄 **APScheduler** - Güclü zamanlayıcı sistemi
46
+
47
+ ## Platform Dəstəyi
48
+
49
+ - 💻 **Windows** - Windows 10/11 dəstəklənir
50
+ - 🍎 **macOS** - macOS 10.15+ dəstəklənir
51
+ - 🐧 **Linux** - Ubuntu, CentOS, Debian dəstəklənir
52
+ - 🐍 **Python** - Python 3.8+ tələb olunur
53
+
54
+ ## Quraşdırma
55
+
56
+ ```bash
57
+ pip install AzerAI-Plugins-Reminder
58
+ ```
59
+
60
+ ## İstifadə
61
+
62
+ Plugin avtomatik olaraq AzerAI tərəfindən aşkar edilir.
63
+
64
+ ### Əmrlər
65
+
66
+ - `"5 dəqiqə sonra mənə xatırlat"` - Vaxtlı xatırladıcı
67
+ - `"Hər gün saat 09:00da mənə xatırlat"` - Günlük xatırladıcı
68
+ - `"Xatırladıcılarmı göstər"` - Siyahı
69
+ - `"X xatırladıcınızı dayandırın"` - Pause
70
+ - `"X xatırladıcınızı davam et"` - Resume
71
+ - `"X xatırladıcınızı sil"` - Sil
72
+
73
+ ## Fayl struktur
74
+
75
+ ```
76
+ azerai_plugins_reminder/
77
+ ├── __init__.py
78
+ ├── info.py
79
+ ├── main.py
80
+ └── prompts.py
81
+ ```
82
+
83
+ ## Fayllar
84
+
85
+ - `azerai_reminders.json` - Xatırladıcı məlumatları
86
+
87
+ ## Asılılıqlar
88
+
89
+ - `livekit-agents` - AI agent framework
90
+ - `apscheduler` - Zamanlayıcı
91
+
92
+ ## 📄 Lisenziya
93
+
94
+ Bu layihə MIT Lisenziyası ilə lisenziyalaşdırılıb - [LICENSE](https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/blob/main/LICENSE) faylına baxın.
95
+
96
+ ## 📞 Əlaqə
97
+
98
+ - **Müəllif:** AzerStudio Dev
99
+ - **Email:** Info.AzerStudioDev@gmail.com
100
+ - **GitHub:** https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder
101
+ - **PyPI:** https://pypi.org/project/AzerAI-Plugins-Reminder/
102
+
103
+ ---
104
+
105
+ **🇦🇿 Azərbaycanın ilk tam plugin ekosistemli AI asistentinin Reminder plugini!** 🚀
@@ -0,0 +1,12 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ azerai_plugins_reminder/__init__.py
5
+ azerai_plugins_reminder/info.py
6
+ azerai_plugins_reminder/main.py
7
+ azerai_plugins_reminder/prompts.py
8
+ azerai_plugins_reminder.egg-info/PKG-INFO
9
+ azerai_plugins_reminder.egg-info/SOURCES.txt
10
+ azerai_plugins_reminder.egg-info/dependency_links.txt
11
+ azerai_plugins_reminder.egg-info/requires.txt
12
+ azerai_plugins_reminder.egg-info/top_level.txt
@@ -0,0 +1,2 @@
1
+ livekit-agents
2
+ apscheduler
@@ -0,0 +1 @@
1
+ azerai_plugins_reminder
@@ -0,0 +1,50 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "azerai-plugins-reminder"
7
+ version = "5.0.0"
8
+ description = "**AzerAI Reminder Plugin** - Xatırladıcı Plugin"
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ authors = [
12
+ {name = "AzStudio Dev", email = "Info.AzerStudioDev@gmail.com"}
13
+ ]
14
+ classifiers = [
15
+ "Development Status :: 5 - Production/Stable",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3.8",
20
+ "Programming Language :: Python :: 3.9",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Operating System :: OS Independent",
25
+ "Operating System :: Microsoft :: Windows",
26
+ "Operating System :: Microsoft :: Windows :: Windows 10",
27
+ "Operating System :: Microsoft :: Windows :: Windows 11",
28
+ "Operating System :: POSIX :: Linux",
29
+ "Operating System :: MacOS",
30
+ "Operating System :: MacOS :: MacOS X",
31
+ ]
32
+ keywords = ["azerai", "plugins", "ai", "azerbaijani", "reminder"]
33
+ requires-python = ">=3.8"
34
+
35
+ dependencies = [
36
+ "livekit-agents",
37
+ "apscheduler"
38
+ ]
39
+
40
+ [project.urls]
41
+ Homepage = "https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder"
42
+ Repository = "https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder.git"
43
+ "Bug Tracker" = "https://github.com/AzerStudio-Dev/AzerAI-Plugins-Reminder/issues"
44
+
45
+ [tool.setuptools.packages.find]
46
+ where = ["."]
47
+ include = ["azerai_plugins_reminder*"]
48
+
49
+ [tool.setuptools.package-data]
50
+ azerai_plugins_reminder = ["*.txt", "*.md"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+