mrwabnalas40 commited on
Commit
4686cf8
·
verified ·
1 Parent(s): 498f51d

Upload 20 files

Browse files
Nora-AlQahtani.gitignore.txt ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ #.idea/
Nora-AlQahtani.replit.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ entrypoint = "main.py"
2
+ modules = ["python-3.11"]
3
+
4
+ [nix]
5
+ channel = "stable-24_05"
6
+ packages = ["bash", "ffmpeg-full", "freetype", "geckodriver", "gitFull", "imagemagickBig", "lcms2", "libGL", "libGLU", "libimagequant", "libjpeg", "libtiff", "libwebp", "libxcrypt", "openjpeg", "playwright-driver", "tcl", "tesseract", "tk", "zlib"]
7
+
8
+ [unitTest]
9
+ language = "python3"
10
+
11
+ [gitHubImport]
12
+ requiredFiles = [".replit", "replit.nix"]
13
+
14
+ [deployment]
15
+ run = ["python3", "main.py"]
16
+ deploymentTarget = "cloudrun"
17
+
18
+ [[ports]]
19
+ localPort = 5000
20
+ externalPort = 80
knowledge.json ADDED
@@ -0,0 +1,1063 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "1421046090": [
3
+ {
4
+ "q": "صل على رسول الله صلى الله عليه وسلم",
5
+ "a": "وصلتني رسالتك: «صل على رسول الله صلى الله عليه وسلم». ماذا تريد بعدها؟",
6
+ "user": "unknown",
7
+ "meta": {
8
+ "peer_id": 1421046090,
9
+ "tg_username": "unknown",
10
+ "chat_type": "خاص",
11
+ "sender_id": 1421046090,
12
+ "sender_username": "omsdtechno"
13
+ },
14
+ "ts": 1757056837
15
+ },
16
+ {
17
+ "q": "صلوا على النبي صلى الله عليه وسلم",
18
+ "a": "وصلتني رسالتك: «صلوا على النبي صلى الله عليه وسلم». ماذا تريد بعدها؟",
19
+ "user": "unknown",
20
+ "meta": {
21
+ "peer_id": 1421046090,
22
+ "tg_username": "unknown",
23
+ "chat_type": "خاص",
24
+ "sender_id": 1421046090,
25
+ "sender_username": "omsdtechno"
26
+ },
27
+ "ts": 1757057070
28
+ },
29
+ {
30
+ "q": "لا اله الا الله",
31
+ "a": "وصلتني رسالتك: «لا اله الا الله». ماذا تريد بعدها؟",
32
+ "user": "unknown",
33
+ "meta": {
34
+ "peer_id": 1421046090,
35
+ "tg_username": "unknown",
36
+ "chat_type": "خاص",
37
+ "sender_id": 1421046090,
38
+ "sender_username": "omsdtechno"
39
+ },
40
+ "ts": 1757080253
41
+ }
42
+ ],
43
+ "-1001688149434": [
44
+ {
45
+ "q": "• ﴿فَٱذۡكُرُونِیۤ أَذۡكُرۡكُمۡ﴾.\n\n- «سُبْحَانَ اللهِ».\n- «الحَمْدُ للهِ».\n- «لَا إلَهَ إلَّا اللهُ».\n- «اللهُ أكْبَرُ».\n- «لَا حَوْلَ وَلَا قُوَّةَ إلَّا بِاللهِ».\n- «لَا إلَهَ إلَّا أَنْتَ سُبْحَانَكَ إنِّي كُنْتُ مِنَ الظَّالِمِينَ».\n- «رَبِّ اغْفِرْ لِي وَتُبْ عَلَيَّ إنَّكَ أنْتَ التَّوَّابُ الرَّحِيمُ».",
46
+ "a": "وصلتني رسالتك: «• ﴿فَٱذۡكُرُونِیۤ أَذۡكُرۡكُمۡ﴾.\n\n- «سُبْحَانَ اللهِ».\n- «الحَمْدُ للهِ».\n- «لَا إلَهَ إلَّا اللهُ».\n- «اللهُ أكْبَرُ».\n- «لَا حَوْلَ وَلَا قُوَّةَ إلَّا بِاللهِ».\n- «لَا إلَهَ إلَّا أَنْتَ سُبْحَانَكَ إنِّي كُنْتُ مِنَ الظَّالِمِينَ».\n- «رَبِّ اغْفِرْ لِي وَتُبْ عَلَيَّ إنَّكَ أنْتَ التَّوَّابُ الرَّحِيمُ».». ماذا تريد بعدها؟",
47
+ "user": "fwaeed_deneah",
48
+ "meta": {
49
+ "peer_id": -1001688149434,
50
+ "tg_username": "fwaeed_deneah",
51
+ "chat_type": "مجموعة",
52
+ "sender_id": 7504191103,
53
+ "sender_username": null
54
+ },
55
+ "ts": 1757065615
56
+ },
57
+ {
58
+ "q": "ليه الجروب أصبح كده بدون تفاعل مش زي الاول",
59
+ "a": "وصلتني رسالتك: «ليه الجروب أصبح كده بدون تفاعل مش زي الاول». ماذا تريد بعدها؟",
60
+ "user": "fwaeed_deneah",
61
+ "meta": {
62
+ "peer_id": -1001688149434,
63
+ "tg_username": "fwaeed_deneah",
64
+ "chat_type": "مجموعة",
65
+ "sender_id": 8354359460,
66
+ "sender_username": null
67
+ },
68
+ "ts": 1757065976
69
+ },
70
+ {
71
+ "q": "انت تعرفني ؟",
72
+ "a": "وصلتني رسالتك: «انت تعرفني ؟». ماذا تريد بعدها؟",
73
+ "user": "fwaeed_deneah",
74
+ "meta": {
75
+ "peer_id": -1001688149434,
76
+ "tg_username": "fwaeed_deneah",
77
+ "chat_type": "مجموعة",
78
+ "sender_id": 8354359460,
79
+ "sender_username": null
80
+ },
81
+ "ts": 1757066577
82
+ },
83
+ {
84
+ "q": "لأنك غير موجودي",
85
+ "a": "وصلتني رسالتك: «لأنك غير موجودي». ماذا تريد بعدها؟",
86
+ "user": "fwaeed_deneah",
87
+ "meta": {
88
+ "peer_id": -1001688149434,
89
+ "tg_username": "fwaeed_deneah",
90
+ "chat_type": "مجموعة",
91
+ "sender_id": 7504191103,
92
+ "sender_username": null
93
+ },
94
+ "ts": 1757066577
95
+ },
96
+ {
97
+ "q": "ميلا",
98
+ "a": "وصلتني رسالتك: «ميلا». ماذا تريد بعدها؟",
99
+ "user": "fwaeed_deneah",
100
+ "meta": {
101
+ "peer_id": -1001688149434,
102
+ "tg_username": "fwaeed_deneah",
103
+ "chat_type": "مجموعة",
104
+ "sender_id": 7504191103,
105
+ "sender_username": null
106
+ },
107
+ "ts": 1757066627
108
+ },
109
+ {
110
+ "q": "🇸🇦 عذرآ عزيزي ↤ ابو\n🇸🇦 ممنوع التوجيه هنا",
111
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ ابو\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
112
+ "user": "unknown",
113
+ "meta": {
114
+ "peer_id": -1001688149434,
115
+ "tg_username": "unknown",
116
+ "chat_type": "مجموعة",
117
+ "sender_id": 6740120966,
118
+ "sender_username": "Musliembot"
119
+ },
120
+ "ts": 1757067239
121
+ },
122
+ {
123
+ "q": "🇸🇦 عذرآ عزيزي ↤ 🦋\n🇸🇦 ممنوع التوجيه هنا",
124
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ 🦋\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
125
+ "user": "unknown",
126
+ "meta": {
127
+ "peer_id": -1001688149434,
128
+ "tg_username": "unknown",
129
+ "chat_type": "مجموعة",
130
+ "sender_id": 6740120966,
131
+ "sender_username": "Musliembot"
132
+ },
133
+ "ts": 1757067419
134
+ },
135
+ {
136
+ "q": "🇸🇦 عذرآ عزيزي ↤ الشاعر ابو أسامة\n🇸🇦 ممنوع ارسال الفيديو",
137
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ الشاعر ابو أسامة\n🇸🇦 ممنوع ارسال الفيديو». ماذا تريد بعدها؟",
138
+ "user": "fwaeed_deneah",
139
+ "meta": {
140
+ "peer_id": -1001688149434,
141
+ "tg_username": "fwaeed_deneah",
142
+ "chat_type": "مجموعة",
143
+ "sender_id": 6740120966,
144
+ "sender_username": "Musliembot"
145
+ },
146
+ "ts": 1757067780
147
+ },
148
+ {
149
+ "q": "ومضى الرفاق خلفوا من بعدهم .. ألمّ يُمزق مُهجتي ..\n..\n#شاهد تجمع الناس على جثمان الشهيد القسامي طارق دلول وشمّ رائحة المسك التي تفوح منهُ ..\n..\n#شهداء_القسام ..",
150
+ "a": "وصلتني رسالتك: «ومضى الرفاق خلفوا من بعدهم .. ألمّ يُمزق مُهجتي ..\n..\n#شاهد تجمع الناس على جثمان الشهيد القسامي طارق دلول وشمّ رائحة المسك التي تفوح منهُ ..\n..\n#شهداء_القسام ..». ماذا تريد بعدها؟",
151
+ "user": "fwaeed_deneah",
152
+ "meta": {
153
+ "peer_id": -1001688149434,
154
+ "tg_username": "fwaeed_deneah",
155
+ "chat_type": "مجموعة",
156
+ "sender_id": 8069943909,
157
+ "sender_username": null
158
+ },
159
+ "ts": 1757067780
160
+ },
161
+ {
162
+ "q": "اللهُمَّ صَلِّ وسّلِم وبارٌك على سيدنا مُحمد وعلى آلـِه وصحبـِه أجمعـين. 🤍",
163
+ "a": "وصلتني رسالتك: «اللهُمَّ صَلِّ وسّلِم وبارٌك على سيدنا مُحمد وعلى آلـِه وصحبـِه أجمعـين. 🤍». ماذا تريد بعدها؟",
164
+ "user": "fwaeed_deneah",
165
+ "meta": {
166
+ "peer_id": -1001688149434,
167
+ "tg_username": "fwaeed_deneah",
168
+ "chat_type": "مجموعة",
169
+ "sender_id": 7799669757,
170
+ "sender_username": null
171
+ },
172
+ "ts": 1757067840
173
+ },
174
+ {
175
+ "q": "بالاول كانت مجموعة حوار وفوائد بس غيروا الحوار لجدال يلي نكتم ويلي نحظر",
176
+ "a": "وصلتني رسالتك: «بالاول كانت مجموعة حوار وفوائد بس غيروا الحوار لجدال يلي نكتم ويلي نحظر». ماذا تريد بعدها؟",
177
+ "user": "fwaeed_deneah",
178
+ "meta": {
179
+ "peer_id": -1001688149434,
180
+ "tg_username": "fwaeed_deneah",
181
+ "chat_type": "مجموعة",
182
+ "sender_id": 8035273217,
183
+ "sender_username": "abo_om_a_r"
184
+ },
185
+ "ts": 1757068322
186
+ },
187
+ {
188
+ "q": "اها",
189
+ "a": "وصلتني رسالتك: «اها». ماذا تريد بعدها؟",
190
+ "user": "fwaeed_deneah",
191
+ "meta": {
192
+ "peer_id": -1001688149434,
193
+ "tg_username": "fwaeed_deneah",
194
+ "chat_type": "مجموعة",
195
+ "sender_id": 8354359460,
196
+ "sender_username": null
197
+ },
198
+ "ts": 1757068383
199
+ },
200
+ {
201
+ "q": "حتى ع أهل البدع ؟؟",
202
+ "a": "وصلتني رسالتك: «حتى ع أهل البدع ؟؟». ماذا تريد بعدها؟",
203
+ "user": "fwaeed_deneah",
204
+ "meta": {
205
+ "peer_id": -1001688149434,
206
+ "tg_username": "fwaeed_deneah",
207
+ "chat_type": "مجموعة",
208
+ "sender_id": 7117580575,
209
+ "sender_username": "jehad_al_jamal"
210
+ },
211
+ "ts": 1757068481
212
+ },
213
+ {
214
+ "q": "ليش شو كانت الرسالة",
215
+ "a": "وصلتني رسالتك: «ليش شو كانت الرسالة». ماذا تريد بعدها؟",
216
+ "user": "fwaeed_deneah",
217
+ "meta": {
218
+ "peer_id": -1001688149434,
219
+ "tg_username": "fwaeed_deneah",
220
+ "chat_type": "مجموعة",
221
+ "sender_id": 8035273217,
222
+ "sender_username": "abo_om_a_r"
223
+ },
224
+ "ts": 1757068530
225
+ },
226
+ {
227
+ "q": "الوضع تمام واجبنا والحمد لله",
228
+ "a": "وصلتني رسالتك: «الوضع تمام واجبنا والحمد لله». ماذا تريد بعدها؟",
229
+ "user": "fwaeed_deneah",
230
+ "meta": {
231
+ "peer_id": -1001688149434,
232
+ "tg_username": "fwaeed_deneah",
233
+ "chat_type": "مجموعة",
234
+ "sender_id": 7188326528,
235
+ "sender_username": "Ahlessone"
236
+ },
237
+ "ts": 1757068643
238
+ },
239
+ {
240
+ "q": "يكفينا أن ننشر سنة نبينا",
241
+ "a": "وصلتني رسالتك: «يكفينا أن ننشر سنة نبينا». ماذا تريد بعدها؟",
242
+ "user": "fwaeed_deneah",
243
+ "meta": {
244
+ "peer_id": -1001688149434,
245
+ "tg_username": "fwaeed_deneah",
246
+ "chat_type": "مجموعة",
247
+ "sender_id": 7188326528,
248
+ "sender_username": "Ahlessone"
249
+ },
250
+ "ts": 1757068647
251
+ },
252
+ {
253
+ "q": "وارتحنا من الجدالات العقيمة",
254
+ "a": "وصلتني رسالتك: «وارتحنا من الجدالات العقيمة». ماذا تريد بعدها؟",
255
+ "user": "fwaeed_deneah",
256
+ "meta": {
257
+ "peer_id": -1001688149434,
258
+ "tg_username": "fwaeed_deneah",
259
+ "chat_type": "مجموعة",
260
+ "sender_id": 7188326528,
261
+ "sender_username": "Ahlessone"
262
+ },
263
+ "ts": 1757068665
264
+ },
265
+ {
266
+ "q": "ولننصرن ديننا ونعلين سنة نبينا",
267
+ "a": "وصلتني رسالتك: «ولننصرن ديننا ونعلين سنة نبينا». ماذا تريد بعدها؟",
268
+ "user": "fwaeed_deneah",
269
+ "meta": {
270
+ "peer_id": -1001688149434,
271
+ "tg_username": "fwaeed_deneah",
272
+ "chat_type": "مجموعة",
273
+ "sender_id": 7188326528,
274
+ "sender_username": "Ahlessone"
275
+ },
276
+ "ts": 1757068741
277
+ },
278
+ {
279
+ "q": "ما تعملي توجيه",
280
+ "a": "وصلتني رسالتك: «ما تعملي توجيه». ماذا تريد بعدها؟",
281
+ "user": "fwaeed_deneah",
282
+ "meta": {
283
+ "peer_id": -1001688149434,
284
+ "tg_username": "fwaeed_deneah",
285
+ "chat_type": "مجموعة",
286
+ "sender_id": 7188326528,
287
+ "sender_username": "Ahlessone"
288
+ },
289
+ "ts": 1757068741
290
+ },
291
+ {
292
+ "q": "اعمل تحويل",
293
+ "a": "وصلتني رسالتك: «اعمل تحويل». ماذا تريد بعدها؟",
294
+ "user": "fwaeed_deneah",
295
+ "meta": {
296
+ "peer_id": -1001688149434,
297
+ "tg_username": "fwaeed_deneah",
298
+ "chat_type": "مجموعة",
299
+ "sender_id": 7188326528,
300
+ "sender_username": "Ahlessone"
301
+ },
302
+ "ts": 1757068741
303
+ },
304
+ {
305
+ "q": "وفيكم بارك الله",
306
+ "a": "وصلتني رسالتك: «وفيكم بارك الله». ماذا تريد بعدها؟",
307
+ "user": "fwaeed_deneah",
308
+ "meta": {
309
+ "peer_id": -1001688149434,
310
+ "tg_username": "fwaeed_deneah",
311
+ "chat_type": "مجموعة",
312
+ "sender_id": 7188326528,
313
+ "sender_username": "Ahlessone"
314
+ },
315
+ "ts": 1757068741
316
+ },
317
+ {
318
+ "q": "نعم بارك الله فيكي",
319
+ "a": "وصلتني رسالتك: «نعم بارك الله فيكي». ماذا تريد بعدها؟",
320
+ "user": "fwaeed_deneah",
321
+ "meta": {
322
+ "peer_id": -1001688149434,
323
+ "tg_username": "fwaeed_deneah",
324
+ "chat_type": "مجموعة",
325
+ "sender_id": 8354359460,
326
+ "sender_username": null
327
+ },
328
+ "ts": 1757068742
329
+ },
330
+ {
331
+ "q": "- سورة: الدخان .\n- القارئ: محمد اللحيدان .",
332
+ "a": "وصلتني رسالتك: «- سورة: الدخان .\n- القارئ: محمد اللحيدان .». ماذا تريد بعدها؟",
333
+ "user": "fwaeed_deneah",
334
+ "meta": {
335
+ "peer_id": -1001688149434,
336
+ "tg_username": "fwaeed_deneah",
337
+ "chat_type": "مجموعة",
338
+ "sender_id": 1666713570,
339
+ "sender_username": "Ke1aed81f1441BOT"
340
+ },
341
+ "ts": 1757068742
342
+ },
343
+ {
344
+ "q": "اهذا من حب النبي صلى الله عليه وآله وسلم وتعظيم النبي🙄",
345
+ "a": "وصلتني رسالتك: «اهذا من حب النبي صلى الله عليه وآله وسلم وتعظيم النبي🙄». ماذا تريد بعدها؟",
346
+ "user": "fwaeed_deneah",
347
+ "meta": {
348
+ "peer_id": -1001688149434,
349
+ "tg_username": "fwaeed_deneah",
350
+ "chat_type": "مجموعة",
351
+ "sender_id": 7188326528,
352
+ "sender_username": "Ahlessone"
353
+ },
354
+ "ts": 1757069283
355
+ },
356
+ {
357
+ "q": "المركز التونسي للكتاب!!! \nسبحان الله ما انتبهت",
358
+ "a": "وصلتني رسالتك: «المركز التونسي للكتاب!!! \nسبحان الله ما انتبهت». ماذا تريد بعدها؟",
359
+ "user": "fwaeed_deneah",
360
+ "meta": {
361
+ "peer_id": -1001688149434,
362
+ "tg_username": "fwaeed_deneah",
363
+ "chat_type": "مجموعة",
364
+ "sender_id": 7188326528,
365
+ "sender_username": "Ahlessone"
366
+ },
367
+ "ts": 1757069344
368
+ },
369
+ {
370
+ "q": "لعب وهرج وسخرية....نسأل الله السلامة",
371
+ "a": "وصلتني رسالتك: «لعب وهرج وسخرية....نسأل الله السلامة». ماذا تريد بعدها؟",
372
+ "user": "fwaeed_deneah",
373
+ "meta": {
374
+ "peer_id": -1001688149434,
375
+ "tg_username": "fwaeed_deneah",
376
+ "chat_type": "مجموعة",
377
+ "sender_id": 7033732260,
378
+ "sender_username": null
379
+ },
380
+ "ts": 1757069344
381
+ },
382
+ {
383
+ "q": "على العموم انا بريئة من المركز فلا ترويج في تونس الا للضلال",
384
+ "a": "وصلتني رسالتك: «على العموم انا بريئة من المركز فلا ترويج في تونس الا للضلال». ماذا تريد بعدها؟",
385
+ "user": "fwaeed_deneah",
386
+ "meta": {
387
+ "peer_id": -1001688149434,
388
+ "tg_username": "fwaeed_deneah",
389
+ "chat_type": "مجموعة",
390
+ "sender_id": 7188326528,
391
+ "sender_username": "Ahlessone"
392
+ },
393
+ "ts": 1757069386
394
+ },
395
+ {
396
+ "q": "المسلمون صاروا اهبل من كفار قريش",
397
+ "a": "وصلتني رسالتك: «المسلمون صاروا اهبل من كفار قريش». ماذا تريد بعدها؟",
398
+ "user": "fwaeed_deneah",
399
+ "meta": {
400
+ "peer_id": -1001688149434,
401
+ "tg_username": "fwaeed_deneah",
402
+ "chat_type": "مجموعة",
403
+ "sender_id": 7188326528,
404
+ "sender_username": "Ahlessone"
405
+ },
406
+ "ts": 1757069411
407
+ },
408
+ {
409
+ "q": "اختي في جروب لو حابة تدخليه بيدخلوا فيها بنات شيعة وفي بنات مشرفين بتناقشو معاهم لو حابة تدخل ممكن يعني يكون سبب ليكي في هداية حد",
410
+ "a": "وصلتني رسالتك: «اختي في جروب لو حابة تدخليه بيدخلوا فيها بنات شيعة وفي بنات مشرفين بتناقشو معاهم لو حابة تدخل ممكن يعني يكون سبب ليكي في هداية حد». ماذا تريد بعدها؟",
411
+ "user": "fwaeed_deneah",
412
+ "meta": {
413
+ "peer_id": -1001688149434,
414
+ "tg_username": "fwaeed_deneah",
415
+ "chat_type": "مجموعة",
416
+ "sender_id": 8354359460,
417
+ "sender_username": null
418
+ },
419
+ "ts": 1757069525
420
+ },
421
+ {
422
+ "q": "للأسف ما عندي وقت الله يعينني على ما عندي لأتمه على خير وجه",
423
+ "a": "وصلتني رسالتك: «للأسف ما عندي وقت الله يعينني على ما عندي لأتمه على خير وجه». ماذا تريد بعدها؟",
424
+ "user": "fwaeed_deneah",
425
+ "meta": {
426
+ "peer_id": -1001688149434,
427
+ "tg_username": "fwaeed_deneah",
428
+ "chat_type": "مجموعة",
429
+ "sender_id": 7188326528,
430
+ "sender_username": "Ahlessone"
431
+ },
432
+ "ts": 1757069585
433
+ },
434
+ {
435
+ "q": "لا",
436
+ "a": "وصلتني رسالتك: «لا». ماذا تريد بعدها؟",
437
+ "user": "fwaeed_deneah",
438
+ "meta": {
439
+ "peer_id": -1001688149434,
440
+ "tg_username": "fwaeed_deneah",
441
+ "chat_type": "مجموعة",
442
+ "sender_id": 8354359460,
443
+ "sender_username": null
444
+ },
445
+ "ts": 1757069641
446
+ },
447
+ {
448
+ "q": "انت علا؟",
449
+ "a": "وصلتني رسالتك: «انت علا؟». ماذا تريد بعدها؟",
450
+ "user": "fwaeed_deneah",
451
+ "meta": {
452
+ "peer_id": -1001688149434,
453
+ "tg_username": "fwaeed_deneah",
454
+ "chat_type": "مجموعة",
455
+ "sender_id": 7188326528,
456
+ "sender_username": "Ahlessone"
457
+ },
458
+ "ts": 1757069641
459
+ },
460
+ {
461
+ "q": "لا انا مصطفى",
462
+ "a": "وصلتني رسالتك: «لا انا مصطفى». ماذا تريد بعدها؟",
463
+ "user": "fwaeed_deneah",
464
+ "meta": {
465
+ "peer_id": -1001688149434,
466
+ "tg_username": "fwaeed_deneah",
467
+ "chat_type": "مجموعة",
468
+ "sender_id": 8354359460,
469
+ "sender_username": null
470
+ },
471
+ "ts": 1757069705
472
+ },
473
+ {
474
+ "q": "العمة نقطة؟",
475
+ "a": "وصلتني رسالتك: «العمة نقطة؟». ماذا تريد بعدها؟",
476
+ "user": "fwaeed_deneah",
477
+ "meta": {
478
+ "peer_id": -1001688149434,
479
+ "tg_username": "fwaeed_deneah",
480
+ "chat_type": "مجموعة",
481
+ "sender_id": 7188326528,
482
+ "sender_username": "Ahlessone"
483
+ },
484
+ "ts": 1757069705
485
+ },
486
+ {
487
+ "q": "حظر",
488
+ "a": "وصلتني رسالتك: «حظر». ماذا تريد بعدها؟",
489
+ "user": "fwaeed_deneah",
490
+ "meta": {
491
+ "peer_id": -1001688149434,
492
+ "tg_username": "fwaeed_deneah",
493
+ "chat_type": "مجموعة",
494
+ "sender_id": 8035273217,
495
+ "sender_username": "abo_om_a_r"
496
+ },
497
+ "ts": 1757070307
498
+ },
499
+ {
500
+ "q": "هل في احد يعرف يشيل الموسيقى؟",
501
+ "a": "وصلتني رسالتك: «هل في احد يعرف يشيل الموسيقى؟». ماذا تريد بعدها؟",
502
+ "user": "fwaeed_deneah",
503
+ "meta": {
504
+ "peer_id": -1001688149434,
505
+ "tg_username": "fwaeed_deneah",
506
+ "chat_type": "مجموعة",
507
+ "sender_id": 7188326528,
508
+ "sender_username": "Ahlessone"
509
+ },
510
+ "ts": 1757070339
511
+ },
512
+ {
513
+ "q": "مابعرف بس حكالي ممنوع الشتم",
514
+ "a": "وصلتني رسالتك: «مابعرف بس حكالي ممنوع الشتم». ماذا تريد بعدها؟",
515
+ "user": "fwaeed_deneah",
516
+ "meta": {
517
+ "peer_id": -1001688149434,
518
+ "tg_username": "fwaeed_deneah",
519
+ "chat_type": "مجموعة",
520
+ "sender_id": 7117580575,
521
+ "sender_username": "jehad_al_jamal"
522
+ },
523
+ "ts": 1757070608
524
+ },
525
+ {
526
+ "q": "الفكرة بعمل توجيه عكل المجموعات الي عندي",
527
+ "a": "وصلتني رسالتك: «الفكرة بعمل توجيه عكل المجموعات الي عندي». ماذا تريد بعدها؟",
528
+ "user": "fwaeed_deneah",
529
+ "meta": {
530
+ "peer_id": -1001688149434,
531
+ "tg_username": "fwaeed_deneah",
532
+ "chat_type": "مجموعة",
533
+ "sender_id": 7117580575,
534
+ "sender_username": "jehad_al_jamal"
535
+ },
536
+ "ts": 1757070608
537
+ },
538
+ {
539
+ "q": "السلام عليكم ورحمة الله وبركاته\n\nيسعدني أن أقدم لكم \"خبير في كتابة الأبحاث العلمية يُقدم خدمات دكتور ممتاز وموثوق. خبرة في كتابة بحوث الماجستير والدكتوراه، وإدارة المشاريع البحثية. يهتم بكل تفاصيل العمل، مع شرح دقيق لكل خطوة ودعم فعّال. اتصل بنا الآن  ارسلك رقم الدكتور لتحقيق نجاح بحثك العلمي!\"",
540
+ "a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته\n\nيسعدني أن أقدم لكم \"خبير في كتابة الأبحاث العلمية يُقدم خدمات دكتور ممتاز وموثوق. خبرة في كتابة بحوث الماجستير والدكتوراه، وإدارة المشاريع البحثية. يهتم بكل تفاصيل العمل، مع شرح دقيق لكل خطوة ودعم فعّال. اتصل بنا الآن  ارسلك رقم الدكتور لتحقيق نجاح بحثك العلمي!\"». ماذا تريد بعدها؟",
541
+ "user": "fwaeed_deneah",
542
+ "meta": {
543
+ "peer_id": -1001688149434,
544
+ "tg_username": "fwaeed_deneah",
545
+ "chat_type": "مجموعة",
546
+ "sender_id": 6329283121,
547
+ "sender_username": null
548
+ },
549
+ "ts": 1757071149
550
+ },
551
+ {
552
+ "q": "جزاكم الله خيرا",
553
+ "a": "وصلتني رسالتك: «جزاكم الله خيرا». ماذا تريد بعدها؟",
554
+ "user": "fwaeed_deneah",
555
+ "meta": {
556
+ "peer_id": -1001688149434,
557
+ "tg_username": "fwaeed_deneah",
558
+ "chat_type": "مجموعة",
559
+ "sender_id": 7188326528,
560
+ "sender_username": "Ahlessone"
561
+ },
562
+ "ts": 1757071690
563
+ },
564
+ {
565
+ "q": "اللهم احفظ اهلنا في غزة وكون لهم ناصرا معينه \nاللهم اعزهم واذل عدوهم \nاللهم اهلك اليهود الكفرة الفجرة الذين اكثروا في الارض الفساد اللهم صب عليهم صوت عذاب\nاللهم بعزتك وقوتك وغضبك وعذابك اللهم أذق اليهود والذين يساندونهم   عذاب عظيم في الدنيا والآخرة \n\nاللهم فرج عن اهلنا في غزة يا مفرج",
566
+ "a": "وصلتني رسالتك: «اللهم احفظ اهلنا في غزة وكون لهم ناصرا معينه \nاللهم اعزهم واذل عدوهم \nاللهم اهلك اليهود الكفرة الفجرة الذين اكثروا في الارض الفساد اللهم صب عليهم صوت عذاب\nاللهم بعزتك وقوتك وغضبك وعذابك اللهم أذق اليهود والذين يساندونهم   عذاب عظيم في الدنيا والآخرة \n\nاللهم فرج عن اهلنا في غزة يا مفرج». ماذا تريد بعدها؟",
567
+ "user": "fwaeed_deneah",
568
+ "meta": {
569
+ "peer_id": -1001688149434,
570
+ "tg_username": "fwaeed_deneah",
571
+ "chat_type": "مجموعة",
572
+ "sender_id": 6817628882,
573
+ "sender_username": "MmMoatasem"
574
+ },
575
+ "ts": 1757073015
576
+ },
577
+ {
578
+ "q": "خبرة واسعة في إعداد رسائل الماجستير والدكتوراه وإجراء البحوث المتقدمة. ومشاريع التخرج\nخبرة مثبتة في مساعدة الطلاب والباحثين في تحقيق نتائج ممتازة.\n- توجيه شامل ومساندة قوية لتصميم البحوث وتحليل البيانات وكتابة الأوراق العلمية.\n- نشر الن��ائج في المجلات العالميه المحكمه \nلا تدع الفرصة تفوتك لتحقيق أهدافك الأكاديمية بمساعدة اكاديميين ذات خبره عاليه\nالتواصل والاستفسار عبر الخاص",
579
+ "a": "وصلتني رسالتك: «خبرة واسعة في إعداد رسائل الماجستير والدكتوراه وإجراء البحوث المتقدمة. ومشاريع التخرج\nخبرة مثبتة في مساعدة الطلاب والباحثين في تحقيق نتائج ممتازة.\n- توجيه شامل ومساندة قوية لتصميم البحوث وتحليل البيانات وكتابة الأوراق العلمية.\n- نشر النتائج في المجلات العالميه المحكمه \nلا تدع الفرصة تفوتك لتحقيق أهدافك الأكاديمية بمساعدة اكاديميين ذات خبره عاليه\nالتواصل والاستفسار عبر الخاص». ماذا تريد بعدها؟",
580
+ "user": "fwaeed_deneah",
581
+ "meta": {
582
+ "peer_id": -1001688149434,
583
+ "tg_username": "fwaeed_deneah",
584
+ "chat_type": "مجموعة",
585
+ "sender_id": 5760483124,
586
+ "sender_username": null
587
+ },
588
+ "ts": 1757073978
589
+ },
590
+ {
591
+ "q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
592
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
593
+ "user": "fwaeed_deneah",
594
+ "meta": {
595
+ "peer_id": -1001688149434,
596
+ "tg_username": "fwaeed_deneah",
597
+ "chat_type": "مجموعة",
598
+ "sender_id": 6740120966,
599
+ "sender_username": "Musliembot"
600
+ },
601
+ "ts": 1757074019
602
+ },
603
+ {
604
+ "q": "بتكون الكلمة محظورة بالبوت رغم ما تعتبر شتم",
605
+ "a": "وصلتني رسالتك: «بتكون الكلمة محظورة بالبوت رغم ما تعتبر شتم». ماذا تريد بعدها؟",
606
+ "user": "fwaeed_deneah",
607
+ "meta": {
608
+ "peer_id": -1001688149434,
609
+ "tg_username": "fwaeed_deneah",
610
+ "chat_type": "مجموعة",
611
+ "sender_id": 8035273217,
612
+ "sender_username": "abo_om_a_r"
613
+ },
614
+ "ts": 1757074038
615
+ },
616
+ {
617
+ "q": "وإياكم تقدروا تزيلو الصوت من المقطع قبل الارسال من علامة مكبر الصوت",
618
+ "a": "وصلتني رسالتك: «وإياكم تقدروا تزيلو الصوت من المقطع قبل الارسال من علامة مكبر الصوت». ماذا تريد بعدها؟",
619
+ "user": "fwaeed_deneah",
620
+ "meta": {
621
+ "peer_id": -1001688149434,
622
+ "tg_username": "fwaeed_deneah",
623
+ "chat_type": "مجموعة",
624
+ "sender_id": 8035273217,
625
+ "sender_username": "abo_om_a_r"
626
+ },
627
+ "ts": 1757074219
628
+ },
629
+ {
630
+ "q": "واذا أردنا الحفاظ على الصوت مع إزالة الموسيقى؟",
631
+ "a": "وصلتني رسالتك: «واذا أردنا الحفاظ على الصوت مع إزالة الموسيقى؟». ماذا تريد بعدها؟",
632
+ "user": "fwaeed_deneah",
633
+ "meta": {
634
+ "peer_id": -1001688149434,
635
+ "tg_username": "fwaeed_deneah",
636
+ "chat_type": "مجموعة",
637
+ "sender_id": 7188326528,
638
+ "sender_username": "Ahlessone"
639
+ },
640
+ "ts": 1757074459
641
+ },
642
+ {
643
+ "q": "صلى الله عليه وآله وصحبه وسلم",
644
+ "a": "وصلتني رسالتك: «صلى الله عليه وآله وصحبه وسلم». ماذا تريد بعدها؟",
645
+ "user": "fwaeed_deneah",
646
+ "meta": {
647
+ "peer_id": -1001688149434,
648
+ "tg_username": "fwaeed_deneah",
649
+ "chat_type": "مجموعة",
650
+ "sender_id": 7188326528,
651
+ "sender_username": "Ahlessone"
652
+ },
653
+ "ts": 1757074460
654
+ },
655
+ {
656
+ "q": "﴿إِنَّ اللهَ وَمَلَائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا﴾\n\n- اللَّهُمَّ صَلِّ وَسَلِّمْ عَلَى نَبِيِّنَا مُحَمَّدٍ .",
657
+ "a": "وصلتني رسالتك: «﴿إِنَّ اللهَ وَمَلَائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا﴾\n\n- اللَّهُمَّ صَلِّ وَسَلِّمْ عَلَى نَبِيِّنَا مُحَمَّدٍ .». ماذا تريد بعدها؟",
658
+ "user": "fwaeed_deneah",
659
+ "meta": {
660
+ "peer_id": -1001688149434,
661
+ "tg_username": "fwaeed_deneah",
662
+ "chat_type": "مجموعة",
663
+ "sender_id": 8236871947,
664
+ "sender_username": "A_U_K_Y"
665
+ },
666
+ "ts": 1757074460
667
+ },
668
+ {
669
+ "q": "لا هو بالحالتين المنشور موجه توجيه فتم حذفه",
670
+ "a": "وصلتني رسالتك: «لا هو بالحالتين المنشور موجه توجيه فتم حذفه». ماذا تريد بعدها؟",
671
+ "user": "fwaeed_deneah",
672
+ "meta": {
673
+ "peer_id": -1001688149434,
674
+ "tg_username": "fwaeed_deneah",
675
+ "chat_type": "مجموعة",
676
+ "sender_id": 7117580575,
677
+ "sender_username": "jehad_al_jamal"
678
+ },
679
+ "ts": 1757074700
680
+ },
681
+ {
682
+ "q": "السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!",
683
+ "a": "وصلتني رسالتك: «السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!». ماذا تريد بعدها؟",
684
+ "user": "fwaeed_deneah",
685
+ "meta": {
686
+ "peer_id": -1001688149434,
687
+ "tg_username": "fwaeed_deneah",
688
+ "chat_type": "مجموعة",
689
+ "sender_id": 7188019537,
690
+ "sender_username": null
691
+ },
692
+ "ts": 1757075115
693
+ },
694
+ {
695
+ "q": "السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!",
696
+ "a": "وصلتني رسالتك: «السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!». ماذا تريد بعدها؟",
697
+ "user": "fwaeed_deneah",
698
+ "meta": {
699
+ "peer_id": -1001688149434,
700
+ "tg_username": "fwaeed_deneah",
701
+ "chat_type": "مجموعة",
702
+ "sender_id": 7188019537,
703
+ "sender_username": null
704
+ },
705
+ "ts": 1757075180
706
+ },
707
+ {
708
+ "q": "صلو على الحبيب محمد صلى الله عليه وسلم \nواذكرو الله لا إله إلا الله",
709
+ "a": "وصلتني رسالتك: «صلو على الحبيب محمد صلى الله عليه وسلم \nواذكرو الله لا إله إلا الله». ماذا تريد بعدها؟",
710
+ "user": "fwaeed_deneah",
711
+ "meta": {
712
+ "peer_id": -1001688149434,
713
+ "tg_username": "fwaeed_deneah",
714
+ "chat_type": "مجموعة",
715
+ "sender_id": 6817628882,
716
+ "sender_username": "MmMoatasem"
717
+ },
718
+ "ts": 1757076023
719
+ },
720
+ {
721
+ "q": "\"السلام عليكم،\nفرصة للمشاركة في بحث علمي متميز يُنشر في مجلات علمية محكمة (Q1, Q2, Q3) ومعتمدة من الهيئة السعودية للتخصصات الصحية. للراغبين في المشاركة، خاص",
722
+ "a": "وصلتني رسالتك: «\"السلام عليكم،\nفرصة للمشاركة في بحث علمي متميز يُنشر في مجلات علمية محكمة (Q1, Q2, Q3) ومعتمدة من الهيئة السعودية للتخصصات الصحية. للراغبين في المشاركة، خاص». ماذا تريد بعدها؟",
723
+ "user": "fwaeed_deneah",
724
+ "meta": {
725
+ "peer_id": -1001688149434,
726
+ "tg_username": "fwaeed_deneah",
727
+ "chat_type": "مجموعة",
728
+ "sender_id": 7528531037,
729
+ "sender_username": null
730
+ },
731
+ "ts": 1757076463
732
+ },
733
+ {
734
+ "q": "السلام عليكم ورحمة الله وبركاته يا أخوان، عندي دكتور متخصص في:\n\n1. كتابة رسائل الماجستير والدكتوراه.\n2. نشر البحوث في المجلات المحكمة.\n3. تدقيق رسائل الماجستير وإخراجها وفق الدليل الجامعي.\n4. تحليل البيانات والاستاتيستيات.\n5. ترجمة المستندات.\n\nاللي يبغى أي خدمة بحثية يتواصل معي خاص، أعطيه رقمه.",
735
+ "a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته يا أخوان، عندي دكتور متخصص في:\n\n1. كتابة رسائل الماجستير والدكتوراه.\n2. نشر البحوث في المجلات المحكمة.\n3. تدقيق رسائل الماجستير وإخراجها وفق الدليل الجامعي.\n4. تحليل البيانات والاستاتيستيات.\n5. ترجمة المستندات.\n\nاللي يبغى أي خدمة بحثية يتواصل معي خاص، أعطيه رقمه.». ماذا تريد بعدها؟",
736
+ "user": "fwaeed_deneah",
737
+ "meta": {
738
+ "peer_id": -1001688149434,
739
+ "tg_username": "fwaeed_deneah",
740
+ "chat_type": "مجموعة",
741
+ "sender_id": 6838104127,
742
+ "sender_username": null
743
+ },
744
+ "ts": 1757077356
745
+ },
746
+ {
747
+ "q": "يا عالم ابوس ايديك ورجليكم حسوا فينا اناخذكم من غزه والله صعب كثير ومحتاج اكل وطحين 22 دوله عربيه واسلاميه مش قادر تبعث لنا كيلو طحين 💔 حسبي الله ونعم الوكيل حد يساعدني بس اجيب كيلو طحين💔😭🙏",
748
+ "a": "وصلتني رسالتك: «يا عالم ابوس ايديك ورجليكم حسوا فينا اناخذكم من غزه والله صعب كثير ومحتاج اكل وطحين 22 دوله عربيه واسلاميه مش قادر تبعث لنا كيلو طحين 💔 حسبي الله ونعم الوكيل حد يساعدني بس اجيب كيلو طحين💔😭🙏». ماذا تريد بعدها؟",
749
+ "user": "fwaeed_deneah",
750
+ "meta": {
751
+ "peer_id": -1001688149434,
752
+ "tg_username": "fwaeed_deneah",
753
+ "chat_type": "مجموعة",
754
+ "sender_id": 7612419534,
755
+ "sender_username": "adfghj1234"
756
+ },
757
+ "ts": 1757077827
758
+ },
759
+ {
760
+ "q": "السلام عليكم ورحمة الله وبركاته\nنقدم لكم جميع الخدمات البحثية لدعم رحلتكم الأكاديمية، وتشمل:\n✅ إعداد خطة البحث\n✅ كتابة الإطار النظري وفصول الدراسة\n✅ إعداد أبحاث النشر العلمي\n✅ المعالجة الإحصائية باستخدام SPSS\n✅ تصميم أدوات البحث (استبيانات، استمارات...)\n✅ توفير المراجع والكتب والرسائل العلمية والدراسات السابقة\n✅ التدقيق اللغوي والمراجعة العلمية\n✅ تنسيق الرسائل والأبحاث وفق المعايير الأكاديمية\n\n✅ الكشف عن نسبة الاستلال والاقتباس عبر موقع Turnitin\nخاص",
761
+ "a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته\nنقدم لكم جميع الخدمات البحثية لدعم رحلتكم الأكاديمية، وتشمل:\n✅ إعداد خطة البحث\n✅ كتابة الإطار النظري وفصول الدراسة\n✅ إعداد أبحاث النشر العلمي\n✅ المعالجة الإحصائية باستخدام SPSS\n✅ تصميم أدوات البحث (استبيانات، استمارات...)\n✅ توفير المراجع والكتب والرسائل العلمية والدراسات السابقة\n✅ التدقيق اللغوي والمراجعة العلمية\n✅ تنسيق الرسائل والأبحاث وفق المعايير الأكاديمية\n\n✅ الكشف عن نسبة الاستلال والاقتباس عبر موقع Turnitin\nخاص». ماذا تريد بعدها؟",
762
+ "user": "fwaeed_deneah",
763
+ "meta": {
764
+ "peer_id": -1001688149434,
765
+ "tg_username": "fwaeed_deneah",
766
+ "chat_type": "مجموعة",
767
+ "sender_id": 8158913114,
768
+ "sender_username": null
769
+ },
770
+ "ts": 1757078308
771
+ },
772
+ {
773
+ "q": "اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا صَلَّيْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ، اللَّهُمَّ بَارِكْ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا بَارَكْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ\".",
774
+ "a": "وصلتني رسالتك: «اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا صَلَّيْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ، اللَّهُمَّ بَارِكْ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا بَارَكْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ\".». ماذا تريد بعدها؟",
775
+ "user": "fwaeed_deneah",
776
+ "meta": {
777
+ "peer_id": -1001688149434,
778
+ "tg_username": "fwaeed_deneah",
779
+ "chat_type": "مجموعة",
780
+ "sender_id": 877859942,
781
+ "sender_username": null
782
+ },
783
+ "ts": 1757078362
784
+ },
785
+ {
786
+ "q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
787
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
788
+ "user": "fwaeed_deneah",
789
+ "meta": {
790
+ "peer_id": -1001688149434,
791
+ "tg_username": "fwaeed_deneah",
792
+ "chat_type": "مجموعة",
793
+ "sender_id": 6740120966,
794
+ "sender_username": "Musliembot"
795
+ },
796
+ "ts": 1757079512
797
+ },
798
+ {
799
+ "q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
800
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
801
+ "user": "fwaeed_deneah",
802
+ "meta": {
803
+ "peer_id": -1001688149434,
804
+ "tg_username": "fwaeed_deneah",
805
+ "chat_type": "مجموعة",
806
+ "sender_id": 6740120966,
807
+ "sender_username": "Musliembot"
808
+ },
809
+ "ts": 1757079512
810
+ },
811
+ {
812
+ "q": "هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه",
813
+ "a": "وصلتني رسالتك: «هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه». ماذا تريد بعدها؟",
814
+ "user": "fwaeed_deneah",
815
+ "meta": {
816
+ "peer_id": -1001688149434,
817
+ "tg_username": "fwaeed_deneah",
818
+ "chat_type": "مجموعة",
819
+ "sender_id": 7769742191,
820
+ "sender_username": null
821
+ },
822
+ "ts": 1757079572
823
+ },
824
+ {
825
+ "q": "هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه",
826
+ "a": "وصلتني رسالتك: «هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه». ماذا تريد بعدها؟",
827
+ "user": "fwaeed_deneah",
828
+ "meta": {
829
+ "peer_id": -1001688149434,
830
+ "tg_username": "fwaeed_deneah",
831
+ "chat_type": "مجموعة",
832
+ "sender_id": 7769742191,
833
+ "sender_username": null
834
+ },
835
+ "ts": 1757079752
836
+ },
837
+ {
838
+ "q": "صلى الله عليه وآله وصحبه وسلم",
839
+ "a": "وصلتني رسالتك: «صلى الله عليه وآله وصحبه وسلم». ماذا تريد بعدها؟",
840
+ "user": "unknown",
841
+ "meta": {
842
+ "peer_id": -1001688149434,
843
+ "tg_username": "unknown",
844
+ "chat_type": "مجموعة",
845
+ "sender_id": 7188326528,
846
+ "sender_username": "Ahlessone"
847
+ },
848
+ "ts": 1757080450
849
+ },
850
+ {
851
+ "q": "🇸🇦 عذرآ عزيزي ↤ ام\n🇸🇦 ممنوع السب هنا",
852
+ "a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ ام\n🇸🇦 ممنوع السب هنا». ماذا تريد بعدها؟",
853
+ "user": "unknown",
854
+ "meta": {
855
+ "peer_id": -1001688149434,
856
+ "tg_username": "unknown",
857
+ "chat_type": "مجموعة",
858
+ "sender_id": 6740120966,
859
+ "sender_username": "Musliembot"
860
+ },
861
+ "ts": 1757081075
862
+ },
863
+ {
864
+ "q": "🔴 انضميت في شركه استثماريه🔴 وشاركت بمبلغ بسيط 1500﷼وكل يوم تنزل ارباحي 400 ﷼ على حسابي الراجحي من يريد يستثمر\n\nيتواصل مع ابو خالد \n @ebkeld",
865
+ "a": "وصلتني رسالتك: «🔴 انضميت في شركه استثماريه🔴 وشاركت بمبلغ بسيط 1500﷼وكل يوم تنزل ارباحي 400 ﷼ على حسابي الراجحي من يريد يستثمر\n\nيتواصل مع ابو خالد \n @ebkeld». ماذا تريد بعدها؟",
866
+ "user": "fwaeed_deneah",
867
+ "meta": {
868
+ "peer_id": -1001688149434,
869
+ "tg_username": "fwaeed_deneah",
870
+ "chat_type": "مجموعة",
871
+ "sender_id": 8184446145,
872
+ "sender_username": null
873
+ },
874
+ "ts": 1757081075
875
+ },
876
+ {
877
+ "q": "لالا\nنقطتين مو انا",
878
+ "a": "وصلتني رسالتك: «لالا\nنقطتين مو انا». ماذا تريد بعدها؟",
879
+ "user": "fwaeed_deneah",
880
+ "meta": {
881
+ "peer_id": -1001688149434,
882
+ "tg_username": "fwaeed_deneah",
883
+ "chat_type": "مجموعة",
884
+ "sender_id": 8146471582,
885
+ "sender_username": null
886
+ },
887
+ "ts": 1757087230
888
+ },
889
+ {
890
+ "q": "هل انتي علا؟",
891
+ "a": "وصلتني رسالتك: «هل انتي علا؟». ماذا تريد بعدها؟",
892
+ "user": "fwaeed_deneah",
893
+ "meta": {
894
+ "peer_id": -1001688149434,
895
+ "tg_username": "fwaeed_deneah",
896
+ "chat_type": "مجموعة",
897
+ "sender_id": 8146471582,
898
+ "sender_username": null
899
+ },
900
+ "ts": 1757087232
901
+ },
902
+ {
903
+ "q": "كان نقطة وحدي فقلت هي ميلا\nومصري بعد\nالمهم حياك الله",
904
+ "a": "وصلتني رسالتك: «كان نقطة وحدي فقلت هي ميلا\nومصري بعد\nالمهم حياك الله». ماذا تريد بعدها؟",
905
+ "user": "fwaeed_deneah",
906
+ "meta": {
907
+ "peer_id": -1001688149434,
908
+ "tg_username": "fwaeed_deneah",
909
+ "chat_type": "مجموعة",
910
+ "sender_id": 7504191103,
911
+ "sender_username": null
912
+ },
913
+ "ts": 1757087530
914
+ }
915
+ ],
916
+ "-1002246528783": [
917
+ {
918
+ "q": "https://t.me/abrs09",
919
+ "a": "وصلتني رسالتك: «https://t.me/abrs09». ماذا تريد بعدها؟",
920
+ "user": "RTarabicchat",
921
+ "meta": {
922
+ "peer_id": -1002246528783,
923
+ "tg_username": "RTarabicchat",
924
+ "chat_type": "مجموعة",
925
+ "sender_id": 6056326351,
926
+ "sender_username": "maddasma7"
927
+ },
928
+ "ts": 1757079806
929
+ },
930
+ {
931
+ "q": "https://t.me/Abo_waled4",
932
+ "a": "وصلتني رسالتك: «https://t.me/Abo_waled4». ماذا تريد بعدها؟",
933
+ "user": "RTarabicchat",
934
+ "meta": {
935
+ "peer_id": -1002246528783,
936
+ "tg_username": "RTarabicchat",
937
+ "chat_type": "مجموعة",
938
+ "sender_id": 6056326351,
939
+ "sender_username": "maddasma7"
940
+ },
941
+ "ts": 1757080024
942
+ }
943
+ ],
944
+ "6602941635": [
945
+ {
946
+ "q": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
947
+ "a": "وصلتني رسالتك: «مرحبا! كيف يمكنني مساعدتك اليوم؟». ماذا تريد بعدها؟",
948
+ "user": "unknown",
949
+ "meta": {
950
+ "peer_id": 6602941635,
951
+ "tg_username": "unknown",
952
+ "chat_type": "خاص",
953
+ "sender_id": 6602941635,
954
+ "sender_username": "oommssddbot"
955
+ },
956
+ "ts": 1757085777
957
+ },
958
+ {
959
+ "q": "هـٰـبـٰكـٰن 🚀 👍",
960
+ "a": "وصلتني رسالتك: «هـٰـبـٰكـٰن 🚀 👍». ماذا تريد بعدها؟",
961
+ "user": "unknown",
962
+ "meta": {
963
+ "peer_id": 6602941635,
964
+ "tg_username": "unknown",
965
+ "chat_type": "خاص",
966
+ "sender_id": 6602941635,
967
+ "sender_username": "oommssddbot"
968
+ },
969
+ "ts": 1757085892
970
+ },
971
+ {
972
+ "q": "مرحبا، هل يمكنني مساعدتك اليوم؟ أريد أن تعرف على كيفية استخدام هذا الهاتف الجديد. كيف يمكنني مشاركة رسال",
973
+ "a": "وصلتني رسالتك: «مرحبا، هل يمكنني مساعدتك اليوم؟ أريد أن تعرف على كيفية استخدام هذا الهاتف الجديد. كيف يمكنني مشاركة رسال». ماذا تريد بعدها؟",
974
+ "user": "unknown",
975
+ "meta": {
976
+ "peer_id": 6602941635,
977
+ "tg_username": "unknown",
978
+ "chat_type": "خاص",
979
+ "sender_id": 6602941635,
980
+ "sender_username": "oommssddbot"
981
+ },
982
+ "ts": 1757086102
983
+ },
984
+ {
985
+ "q": "أعتباراً من الوقت الحالي، الساعة تبدأ من حوالي 9:00 صباحاً وتمتد حتى 17:53",
986
+ "a": "وصلتني رسالتك: «أعتباراً من الوقت الحالي، الساعة تبدأ من حوالي 9:00 صباحاً وتمتد حتى 17:53». ماذا تريد بعدها؟",
987
+ "user": "unknown",
988
+ "meta": {
989
+ "peer_id": 6602941635,
990
+ "tg_username": "unknown",
991
+ "chat_type": "خاص",
992
+ "sender_id": 6602941635,
993
+ "sender_username": "oommssddbot"
994
+ },
995
+ "ts": 1757087549
996
+ },
997
+ {
998
+ "q": "بخصوص هذه الرسالة التي تم تقديمها لك، ستأخذ فترة زمنية محددة. إذا كنت في هذا الوقت، فكنت قد",
999
+ "a": "وصلتني رسالتك: «بخصوص هذه الرسالة التي تم تقديمها لك، ستأخذ فترة زمنية محددة. إذا كنت في هذا الوقت، فكنت قد». ماذا تريد بعدها؟",
1000
+ "user": "unknown",
1001
+ "meta": {
1002
+ "peer_id": 6602941635,
1003
+ "tg_username": "unknown",
1004
+ "chat_type": "خاص",
1005
+ "sender_id": 6602941635,
1006
+ "sender_username": "oommssddbot"
1007
+ },
1008
+ "ts": 1757087663
1009
+ },
1010
+ {
1011
+ "q": "يمكنني أن أساعدك في تحليل أحداث اليوم الخاصة بك أو المعلومة الجديدة التي تم تقديمه لك. هل لديك أي آر",
1012
+ "a": "وصلتني رسالتك: «يمكنني أن أساعدك في تحليل أحداث اليوم الخاصة بك أو المعلومة الجديدة التي تم تقديمه لك. هل لديك أي آر». ماذا تريد بعدها؟",
1013
+ "user": "unknown",
1014
+ "meta": {
1015
+ "peer_id": 6602941635,
1016
+ "tg_username": "unknown",
1017
+ "chat_type": "خاص",
1018
+ "sender_id": 6602941635,
1019
+ "sender_username": "oommssddbot"
1020
+ },
1021
+ "ts": 1757088131
1022
+ },
1023
+ {
1024
+ "q": "أنا سأبحث عن المعلومات حول حالتي اليوم والمشكلات التي قد يواجهها شخصيًا. كيف يمكنني أن أساعدك في",
1025
+ "a": "وصلتني رسالتك: «أنا سأبحث عن المعلومات حول حالتي اليوم والمشكلات التي قد يواجهها شخصيًا. كيف يمكنني أن أساعدك في». ماذا تريد بعدها؟",
1026
+ "user": "unknown",
1027
+ "meta": {
1028
+ "peer_id": 6602941635,
1029
+ "tg_username": "unknown",
1030
+ "chat_type": "خاص",
1031
+ "sender_id": 6602941635,
1032
+ "sender_username": "oommssddbot"
1033
+ },
1034
+ "ts": 1757088235
1035
+ },
1036
+ {
1037
+ "q": "بخصوص هذا الشكر لك على الإزمنة! أنا فريدة من نوع ديني لمساعدتك في تطبيقاتك.",
1038
+ "a": "وصلتني رسالتك: «بخصوص هذا الشكر لك على الإزمنة! أنا فريدة من نوع ديني لمساعدتك في تطبيقاتك.». ماذا تريد بعدها؟",
1039
+ "user": "unknown",
1040
+ "meta": {
1041
+ "peer_id": 6602941635,
1042
+ "tg_username": "unknown",
1043
+ "chat_type": "خاص",
1044
+ "sender_id": 6602941635,
1045
+ "sender_username": "oommssddbot"
1046
+ },
1047
+ "ts": 1757088368
1048
+ },
1049
+ {
1050
+ "q": "أعتذر، ولكني لا أستطيع رؤية الرسائل الصوتية أو التلفزيونية لتعكس سلوكك في الوقت",
1051
+ "a": "وصلتني رسالتك: «أعتذر، ولكني لا أستطيع رؤية الرسائل الصوتية أو التلفزيونية لتعكس سلوكك في الوقت». ماذا تريد بعدها؟",
1052
+ "user": "unknown",
1053
+ "meta": {
1054
+ "peer_id": 6602941635,
1055
+ "tg_username": "unknown",
1056
+ "chat_type": "خاص",
1057
+ "sender_id": 6602941635,
1058
+ "sender_username": "oommssddbot"
1059
+ },
1060
+ "ts": 1757088535
1061
+ }
1062
+ ]
1063
+ }
knowledge_search.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # knowledge_search.py
2
+
3
+ import json
4
+ import os
5
+
6
+ class KnowledgeSearch:
7
+ def __init__(self, knowledge_base_path="knowledge_base.json"):
8
+ self.knowledge_base_path = knowledge_base_path
9
+ if not os.path.exists(knowledge_base_path):
10
+ with open(knowledge_base_path, "w", encoding="utf-8") as f:
11
+ json.dump({}, f, ensure_ascii=False, indent=2)
12
+
13
+ def search(self, query):
14
+ with open(self.knowledge_base_path, "r", encoding="utf-8") as f:
15
+ data = json.load(f)
16
+ return data.get(query, None)
17
+
18
+ def respond(self, query):
19
+ result = self.search(query)
20
+ if result:
21
+ return f"وجدت الإجابة: {result}"
22
+ else:
23
+ return "لم أجد الإجابة في قاعدة المعرفة الخاصة بي. سأبحث على الإنترنت أو أتعلم لاحقاً."
24
+
25
+ def update_knowledge(self, question, answer):
26
+ with open(self.knowledge_base_path, "r", encoding="utf-8") as f:
27
+ data = json.load(f)
28
+ data[question] = answer
29
+ with open(self.knowledge_base_path, "w", encoding="utf-8") as f:
30
+ json.dump(data, f, ensure_ascii=False, indent=2)
31
+ return "تم تحديث قاعدة المعرفة بنجاح."
knowledge_settings.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "chats": {},
3
+ "min_similarity": 0.82
4
+ }
lan_peer_server.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+
3
+ app = Flask(__name__)
4
+
5
+ @app.route('/run_task', methods=['POST'])
6
+ def run_task():
7
+ data = request.json
8
+ print("📥 Received task:", data)
9
+ if data["task"] == "add":
10
+ a = data["a"]
11
+ b = data["b"]
12
+ result = a + b
13
+ return jsonify({"result": result})
14
+ return jsonify({"error": "Unknown task"})
15
+
16
+ if __name__ == '__main__':
17
+ app.run(host='0.0.0.0', port=7520)
launcher.py ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ #!/usr/bin/env python3
3
+ """
4
+ مشغل موحد لنظام توزيع المهام
5
+ يوفر خيارات متعددة للتشغيل
6
+ """
7
+
8
+ import sys
9
+ import os
10
+ import subprocess
11
+ import argparse
12
+ import time
13
+ from pathlib import Path
14
+ from peer_discovery import PORT
15
+
16
+ def check_requirements():
17
+ """فحص المتطلبات والاعتماديات"""
18
+ required_files = [
19
+ 'background_service.py',
20
+ 'main.py',
21
+ 'peer_server.py',
22
+ 'rpc_server.py',
23
+ 'load_balancer.py'
24
+ ]
25
+
26
+ missing_files = []
27
+ for file in required_files:
28
+ if not Path(file).exists():
29
+ missing_files.append(file)
30
+
31
+ if missing_files:
32
+ print(f"❌ ملفات مفقودة: {', '.join(missing_files)}")
33
+ return False
34
+
35
+ return True
36
+
37
+ def install_tray_dependencies():
38
+ """تثبيت اعتماديات أيقونة شريط النظام"""
39
+ try:
40
+ subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'pystray', 'Pillow'])
41
+ print("✅ تم تثبيت اعتماديات أيقونة شريط النظام")
42
+ return True
43
+ except subprocess.CalledProcessError:
44
+ print("❌ فشل في تثبيت اعتماديات أيقونة شريط النظام")
45
+ return False
46
+
47
+ def start_background_service():
48
+ """بدء تشغيل الخدمة في الخلفية"""
49
+ print("🚀 بدء تشغيل الخدمة في الخلفية...")
50
+
51
+ # تشغيل الخدمة الخلفية
52
+ process = subprocess.Popen(
53
+ [sys.executable, 'background_service.py', 'start'],
54
+ stdout=subprocess.PIPE,
55
+ stderr=subprocess.PIPE
56
+ )
57
+
58
+ # انتظار قليل للتأكد من بدء التشغيل
59
+ time.sleep(2)
60
+
61
+ if process.poll() is None:
62
+ print("✅ تم بدء تشغيل الخدمة الخلفية بنجاح")
63
+ return process
64
+ else:
65
+ print("❌ فشل في بدء تشغيل الخدمة الخلفية")
66
+ return None
67
+
68
+ def start_with_tray():
69
+ """تشغيل النظام مع أيقونة شريط النظام"""
70
+ print("🖱️ تشغيل النظام مع أيقونة شريط النظام...")
71
+
72
+ # بدء الخدمة الخلفية أولاً
73
+ bg_process = start_background_service()
74
+ if not bg_process:
75
+ return False
76
+
77
+ time.sleep(3) # انتظار حتى تصبح الخدمة جاهزة
78
+
79
+ try:
80
+ # تشغيل أيقونة شريط النظام
81
+ subprocess.run([sys.executable, 'system_tray.py'])
82
+ except KeyboardInterrupt:
83
+ print("\n🛑 إيقاف النظام...")
84
+ # إيقاف الخدمة الخلفية
85
+ try:
86
+ import requests
87
+ requests.post('http://localhost:8888/stop', timeout=5)
88
+ except:
89
+ bg_process.terminate()
90
+
91
+ return True
92
+
93
+ def start_interactive():
94
+ """تشغيل النظام في الوضع التفاعلي"""
95
+ print("🖥️ تشغيل النظام في الوضع التفاعلي...")
96
+
97
+ # بدء الخدمة الخلفية
98
+ bg_process = start_background_service()
99
+ if not bg_process:
100
+ return False
101
+
102
+ time.sleep(3)
103
+
104
+ # تشغيل الواجهة التفاعلية
105
+ try:
106
+ import requests
107
+ requests.post('http://localhost:8888/show-ui', timeout=5)
108
+ print("✅ تم تشغيل الواجهة التفاعلية")
109
+
110
+ # فتح المتصفح
111
+ import webbrowser
112
+ time.sleep(2)
113
+ webbrowser.open('http://localhost:5173')
114
+
115
+ # انتظار إنهاء المستخدم
116
+ input("اضغط Enter لإيقاف النظام...")
117
+
118
+ except KeyboardInterrupt:
119
+ pass
120
+ finally:
121
+ print("🛑 إيقاف النظام...")
122
+ try:
123
+ import requests
124
+ requests.post('http://localhost:8888/stop', timeout=5)
125
+ except:
126
+ bg_process.terminate()
127
+
128
+ return True
129
+
130
+ def start_headless():
131
+ """تشغيل النظام بدون واجهة (للخوادم)"""
132
+ print("⚙️ تشغيل النظام بدون واجهة...")
133
+
134
+ try:
135
+ # تشغيل الخدمة الخلفية والانتظار
136
+ subprocess.run([sys.executable, 'background_service.py', 'start'])
137
+ except KeyboardInterrupt:
138
+ print("\n🛑 إيقاف النظام...")
139
+
140
+ return True
141
+
142
+ def show_status():
143
+ """عرض حالة النظام"""
144
+ subprocess.run([sys.executable, 'background_service.py', 'status'])
145
+
146
+ def stop_system():
147
+ """إيقاف النظام"""
148
+ subprocess.run([sys.executable, 'background_service.py', 'stop'])
149
+
150
+ def main():
151
+ parser = argparse.ArgumentParser(
152
+ description="مشغل نظام توزيع المهام الذكي",
153
+ formatter_class=argparse.RawDescriptionHelpFormatter,
154
+ epilog="""
155
+ أمثلة الاستخدام:
156
+ python launcher.py --tray # تشغيل مع أيقونة شريط النظام
157
+ python launcher.py --interactive # تشغيل تفاعلي مع واجهة
158
+ python launcher.py --headless # تشغيل بدون واجهة (للخوادم)
159
+ python launcher.py --status # عرض حالة النظام
160
+ python launcher.py --stop # إيقاف النظام
161
+ """
162
+ )
163
+
164
+ group = parser.add_mutually_exclusive_group(required=True)
165
+ group.add_argument('--tray', action='store_true',
166
+ help='تشغيل مع أيقونة شريط النظام')
167
+ group.add_argument('--interactive', action='store_true',
168
+ help='تشغيل تفاعلي مع واجهة')
169
+ group.add_argument('--headless', action='store_true',
170
+ help='تشغيل بدون واجهة (للخوادم)')
171
+ group.add_argument('--status', action='store_true',
172
+ help='عرض حالة النظام')
173
+ group.add_argument('--stop', action='store_true',
174
+ help='إيقاف النظام')
175
+
176
+ parser.add_argument('--install-deps', action='store_true',
177
+ help='تثبيت الاعتماديات المطلوبة')
178
+
179
+ args = parser.parse_args()
180
+
181
+ # فحص المتطلبات
182
+ if not check_requirements():
183
+ return 1
184
+
185
+ # تثبيت الاعتماديات إذا طُلب ذلك
186
+ if args.install_deps:
187
+ install_tray_dependencies()
188
+ return 0
189
+
190
+ # تنفيذ الأمر المطلوب
191
+ if args.status:
192
+ show_status()
193
+ elif args.stop:
194
+ stop_system()
195
+ elif args.headless:
196
+ success = start_headless()
197
+ elif args.interactive:
198
+ success = start_interactive()
199
+ elif args.tray:
200
+ # تثبيت اعتماديات أيقونة شريط النظام إذا لم تكن موجودة
201
+ try:
202
+ import pystray
203
+ except ImportError:
204
+ print("📦 تثبيت اعتماديات أيقونة شريط النظام...")
205
+ if not install_tray_dependencies():
206
+ print("❌ فشل في تثبيت الاعتماديات، التشغيل في الوضع التفاعلي...")
207
+ success = start_interactive()
208
+ else:
209
+ success = start_with_tray()
210
+ else:
211
+ success = start_with_tray()
212
+
213
+ return 0 if success else 1
214
+
215
+ if __name__ == "__main__":
216
+ sys.exit(main())
learned_links.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fknowledgelover.com%2Flearn%2Dnew%2Dthings%2Deveryday%2F&rut=7d7b864acc8a0ad994985eeb0bf2b9f3c55a7ba8c6dafdc911bc63c072948058",
3
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fmashable.com%2Farticle%2Ffun%2Dwebsites%2Dimprove%2Dskills&rut=8f1ae5eb9c627d1fc36877fcec3f7bffcb339f324d4aa256a7b533884217da1a",
4
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.powerofpositivity.com%2Flearn%2Dsomething%2Dnew%2F&rut=64b552380eacdc7089350dbef51661caabbf2c72f39b3a3e385679e27b751376",
5
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.lifehack.org%2F417485%2F10%2Dwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Din%2D30%2Dminutes%2Da%2Dday&rut=695a24a9a3fcaeee9162b8edfe23905edb1da4579b62bae6a6297eab2d09ab4f",
6
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fmedium.com%2F%40ozlazarus%2F10%2Duseful%2Dwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday%2D9805f34f0a18&rut=e2d2f7a3b73b4755ab386620231db73a175e133cfe34513c7ed0db9425138ea1",
7
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Firisreading.com%2Fwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday%2F&rut=657a35a062c75eb134a4e9dd67762944905ff3db40089b7150f769924ad04945",
8
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.inc.com%2Flarry%2Dkim%2F40%2Damazing%2Dplaces%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday.html&rut=4325bcdb3351d7678ed4cc7516850a8c3efde0da96282026c8023affd480e5a0",
9
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fgohighbrow.com%2F&rut=198629341aae9673fa9336e83a9999aab3df7549bd7475f2a70756864b458bf2",
10
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.creativeboom.com%2Fresources%2F58%2Dof%2Dthe%2Dbest%2Dwebsites%2Dand%2Dapps%2Dto%2Dlearn%2Dsomething%2Dnew%2F&rut=b64342e80e17f159c4f917ff36d7b0653bbac1fcd542be08c5e84fcd9bbd1e7d",
11
+ "https://duckduckgo.com/l/?uddg=https%3A%2F%2Fbeebom.com%2Flearning%2Dwebsites%2F&rut=96c8739116802d26910f415f6ffd983103bd863b7f18a8fcb38c02abf361dd4c"
12
+ ]
learner.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+ import json
4
+ import os
5
+ from difflib import get_close_matches
6
+ from analyzer import fix_url, detect_media_type
7
+ from memory import load_memory, save_memory, load_global_memory, save_global_memory
8
+
9
+ LEARNING_FILE = "learned_links.json"
10
+ SEARCH_QUERY = "websites to learn something new every day"
11
+ SEARCH_ENGINE_URL = f"https://html.duckduckgo.com/html/?q={SEARCH_QUERY}"
12
+
13
+ # الردود التلقائية الذكية
14
+ def auto_answer(message):
15
+ message = message.strip().lower()
16
+ if message.startswith("هل ابدأ") or message.startswith("ابدأ") or message in ["هل نبدأ؟", "ابدأ؟", "ابدا"]:
17
+ return "نعم ابدأ"
18
+ elif message in ["نعم", "لا", "نعم أو لا", "نعم او لا"]:
19
+ return "نعم"
20
+ elif "أو" in message or "او" in message:
21
+ return message.split()[0]
22
+ elif message.startswith("هل تريدني") or message.startswith("هل تود") or message.startswith("هل تبي") or message.startswith("اذا تبي"):
23
+ return "نعم"
24
+ elif message.startswith("هل تحتاج"):
25
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
26
+ elif message.startswith("ما هي"):
27
+ return "ليس الآن"
28
+ elif "تفصيل" in message:
29
+ return "ليس الآن"
30
+ elif message.startswith("قول لي"):
31
+ return "موافق"
32
+ elif "جاهز" in message:
33
+ return "ابدأ"
34
+ elif message.startswith("هل تريد"):
35
+ return "نعم"
36
+ elif "هل تحتاج شيء آخر" in message or "هل تحتاج لشيء اخر" in message:
37
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
38
+ return None
39
+
40
+ # المجيب الذكي
41
+ def generate_reply(message, username="مجهول"):
42
+ global_memory = load_global_memory()
43
+
44
+ auto = auto_answer(message)
45
+ if auto:
46
+ return auto
47
+
48
+ if message in global_memory:
49
+ return global_memory[message]
50
+
51
+ matches = get_close_matches(message, global_memory.keys(), n=1, cutoff=0.6)
52
+ if matches:
53
+ return global_memory[matches[0]]
54
+
55
+ if message.startswith("http://") or message.startswith("https://"):
56
+ media_type = detect_media_type(message)
57
+ if media_type == 'image':
58
+ reply = f'<img src="{message}" alt="صورة" width="300">'
59
+ elif media_type == 'video':
60
+ reply = f'<video controls width="300"><source src="{message}"></video>'
61
+ elif media_type == 'audio':
62
+ reply = f'<audio controls><source src="{message}"></audio>'
63
+ else:
64
+ reply = f'<a href="{message}" target="_blank">رابط خارجي</a>'
65
+ else:
66
+ reply = f"رد تلقائي: {message[::-1]}"
67
+
68
+ if '//' in message:
69
+ words = message.split()
70
+ for i in range(len(words)):
71
+ if '//' in words[i]:
72
+ words[i] = fix_url(words[i])
73
+ reply += "\nمصدر خارجي بعد التصحيح: " + " ".join(words)
74
+
75
+ global_memory[message] = reply
76
+ save_global_memory(global_memory)
77
+ return reply
78
+
79
+ # تعليم تلقائي
80
+ def fetch_learning_links():
81
+ headers = {
82
+ "User-Agent": "Mozilla/5.0"
83
+ }
84
+ try:
85
+ response = requests.get(SEARCH_ENGINE_URL, headers=headers, timeout=10)
86
+ soup = BeautifulSoup(response.text, "html.parser")
87
+ except Exception as e:
88
+ print("فشل في الاتصال بمصدر التعلم:", e)
89
+ return []
90
+
91
+ links = []
92
+ for a in soup.find_all("a", href=True):
93
+ href = a['href']
94
+ if "http" in href or href.startswith("//"):
95
+ clean_link = fix_url(href)
96
+ if clean_link not in links:
97
+ links.append(clean_link)
98
+ return links[:10]
99
+
100
+ def save_learned_links(links):
101
+ with open(LEARNING_FILE, "w", encoding="utf-8") as f:
102
+ json.dump(links, f, indent=2, ensure_ascii=False)
103
+
104
+ def auto_learn():
105
+ try:
106
+ links = fetch_learning_links()
107
+ save_learned_links(links)
108
+ memory = load_global_memory()
109
+ for link in links:
110
+ if link not in memory:
111
+ memory[link] = f"تعلمت من الرابط: {link}"
112
+ save_global_memory(memory)
113
+ print("تم التعلّم التلقائي وتحديث الذاكرة.")
114
+ except Exception as e:
115
+ print("نورا: حدث خطأ أثناء التعلّم:", str(e))
live_streaming.py ADDED
@@ -0,0 +1,406 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # live_streaming.py - نظام البث المباشر للألعاب والفيديو
3
+
4
+ import cv2
5
+ import numpy as np
6
+ import time
7
+ import threading
8
+ import logging
9
+ import asyncio
10
+ import base64
11
+ import json
12
+ from datetime import datetime
13
+ from processor_manager import should_offload
14
+ from remote_executor import execute_remotely
15
+ from functools import wraps
16
+ from peer_discovery import PORT
17
+
18
+ logging.basicConfig(level=logging.INFO)
19
+
20
+ class LiveStreamManager:
21
+ def __init__(self):
22
+ self.active_streams = {}
23
+ self.processing_nodes = []
24
+ self.load_balancer = StreamLoadBalancer()
25
+
26
+ def register_processing_node(self, node_id, capabilities):
27
+ """تسجيل عقدة معالجة جديدة"""
28
+ self.processing_nodes.append({
29
+ "id": node_id,
30
+ "capabilities": capabilities,
31
+ "load": 0.0,
32
+ "last_ping": datetime.now()
33
+ })
34
+ logging.info(f"📡 تم تسجيل عقدة معالجة: {node_id}")
35
+
36
+ class StreamLoadBalancer:
37
+ def __init__(self):
38
+ self.node_loads = {}
39
+
40
+ def get_best_node(self, task_type, nodes):
41
+ """اختيار أفضل عقدة للمعالجة"""
42
+ suitable_nodes = [n for n in nodes if task_type in n.get("capabilities", [])]
43
+ if not suitable_nodes:
44
+ return None
45
+ return min(suitable_nodes, key=lambda x: x["load"])
46
+
47
+ def stream_offload(func):
48
+ """ديكوراتور خاص بالبث المباشر"""
49
+ @wraps(func)
50
+ def wrapper(*args, **kwargs):
51
+ complexity = estimate_stream_complexity(func, args, kwargs)
52
+
53
+ if complexity > 70 or should_offload(complexity):
54
+ logging.info(f"📺 إرسال مهمة البث {func.__name__} للمعالجة الموزعة")
55
+ return execute_remotely(func.__name__, args, kwargs)
56
+
57
+ logging.info(f"📺 معالجة البث محلياً: {func.__name__}")
58
+ return func(*args, **kwargs)
59
+ return wrapper
60
+
61
+ def estimate_stream_complexity(func, args, kwargs):
62
+ """تقدير تعقيد معالجة البث"""
63
+ if func.__name__ == "process_game_stream":
64
+ return args[1] * args[2] / 10000 # FPS × الدقة
65
+ elif func.__name__ == "real_time_video_enhancement":
66
+ return args[0] * 20 # عدد التحسينات × 20
67
+ elif func.__name__ == "multi_stream_processing":
68
+ return len(args[0]) * 25 # عدد البثوث × 25
69
+ elif func.__name__ == "ai_commentary_generation":
70
+ return args[1] * 15 # طول النص × 15
71
+ return 40
72
+
73
+ # ═══════════════════════════════════════════════════════════════
74
+ # معالجة بث الألعاب المباشر
75
+ # ═══════════════════════════════════════════════════════════════
76
+
77
+ @stream_offload
78
+ def process_game_stream(stream_data, fps, resolution, enhancements=None):
79
+ """معالجة بث الألعاب في الوقت الفعلي"""
80
+ start_time = time.time()
81
+
82
+ if enhancements is None:
83
+ enhancements = ["noise_reduction", "color_enhancement"]
84
+
85
+ logging.info(f"🎮 معالجة بث الألعاب - FPS: {fps}, الدقة: {resolution}")
86
+ logging.info(f"🔧 التحسينات: {enhancements}")
87
+
88
+ # محاكاة معالجة الإطارات
89
+ frame_count = len(stream_data) if isinstance(stream_data, list) else 60
90
+ processing_per_frame = 0.01 + (len(enhancements) * 0.005)
91
+ total_processing_time = frame_count * processing_per_frame
92
+
93
+ # محاكاة المعالجة
94
+ time.sleep(min(total_processing_time, 2))
95
+
96
+ # حساب جودة البث
97
+ quality_score = min(100, 60 + (len(enhancements) * 8) + (fps / 2))
98
+ latency = max(50, 200 - (fps * 2)) # أقل تأخير مع FPS أعلى
99
+
100
+ result = {
101
+ "status": "success",
102
+ "stream_type": "game",
103
+ "fps_processed": fps,
104
+ "resolution": resolution,
105
+ "frames_processed": frame_count,
106
+ "enhancements_applied": enhancements,
107
+ "quality_score": round(quality_score, 1),
108
+ "latency_ms": latency,
109
+ "processing_time": time.time() - start_time,
110
+ "bandwidth_optimized": True
111
+ }
112
+
113
+ logging.info(f"✅ تمت معالجة بث اللعبة - جودة: {result['quality_score']}%")
114
+ return result
115
+
116
+ @stream_offload
117
+ def real_time_video_enhancement(enhancement_types, video_quality="1080p", target_fps=60):
118
+ """تحسين الفيديو في الوقت الفعلي"""
119
+ start_time = time.time()
120
+
121
+ available_enhancements = {
122
+ "upscaling": "تحسين الدقة",
123
+ "noise_reduction": "إزالة التشويش",
124
+ "color_grading": "تصحيح الألوان",
125
+ "motion_smoothing": "تنعيم الحركة",
126
+ "hdr_enhancement": "تحسين HDR",
127
+ "sharpening": "زيادة الحدة",
128
+ "stabilization": "تثبيت الصورة"
129
+ }
130
+
131
+ quality_multiplier = {"720p": 1, "1080p": 2, "1440p": 3, "4K": 5}
132
+ multiplier = quality_multiplier.get(video_quality, 2)
133
+
134
+ processing_time = len(enhancement_types) * multiplier * target_fps * 0.0001
135
+
136
+ logging.info(f"📹 تحسين الفيديو المباشر - الجودة: {video_quality}")
137
+ logging.info(f"🎯 التحسينات: {enhancement_types}")
138
+
139
+ # محاكاة التحسين
140
+ time.sleep(min(processing_time, 1.5))
141
+
142
+ enhancements_applied = {}
143
+ for enhancement in enhancement_types:
144
+ if enhancement in available_enhancements:
145
+ enhancements_applied[enhancement] = {
146
+ "name": available_enhancements[enhancement],
147
+ "improvement": round(np.random.uniform(15, 35), 1),
148
+ "processing_cost": round(processing_time / len(enhancement_types), 4)
149
+ }
150
+
151
+ result = {
152
+ "status": "success",
153
+ "video_quality": video_quality,
154
+ "target_fps": target_fps,
155
+ "enhancements": enhancements_applied,
156
+ "total_improvement": round(np.mean([e["improvement"] for e in enhancements_applied.values()]), 1),
157
+ "processing_time": time.time() - start_time,
158
+ "real_time_capable": processing_time < (1/target_fps)
159
+ }
160
+
161
+ logging.info(f"✅ تم تحسين الفيديو - تحسن: {result['total_improvement']}%")
162
+ return result
163
+
164
+ # ═══════════════════════════════════════════════════════════════
165
+ # معالجة متعددة البثوث
166
+ # ═══════════════════════════════════════════════════════════════
167
+
168
+ @stream_offload
169
+ def multi_stream_processing(streams_data, processing_mode="parallel"):
170
+ """معالجة عدة بثوث في نفس الوقت"""
171
+ start_time = time.time()
172
+
173
+ logging.info(f"📡 معالجة متعددة البثوث - العدد: {len(streams_data)}")
174
+ logging.info(f"⚙️ وضع المعالجة: {processing_mode}")
175
+
176
+ results = {}
177
+
178
+ if processing_mode == "parallel":
179
+ # محاكاة المعالجة المتوازية
180
+ max_processing_time = max([s.get("complexity", 1) for s in streams_data]) * 0.1
181
+ time.sleep(min(max_processing_time, 2))
182
+
183
+ for i, stream in enumerate(streams_data):
184
+ stream_id = f"stream_{i+1}"
185
+ results[stream_id] = {
186
+ "status": "processed",
187
+ "quality": stream.get("quality", "1080p"),
188
+ "fps": stream.get("fps", 30),
189
+ "enhancement_applied": True,
190
+ "processing_node": f"node_{(i % 3) + 1}" # توزيع على 3 عقد
191
+ }
192
+ else:
193
+ # معالجة تسلسلية
194
+ total_time = sum([s.get("complexity", 1) for s in streams_data]) * 0.05
195
+ time.sleep(min(total_time, 3))
196
+
197
+ for i, stream in enumerate(streams_data):
198
+ stream_id = f"stream_{i+1}"
199
+ results[stream_id] = {
200
+ "status": "processed",
201
+ "quality": stream.get("quality", "1080p"),
202
+ "fps": stream.get("fps", 30),
203
+ "processing_order": i + 1
204
+ }
205
+
206
+ result = {
207
+ "status": "success",
208
+ "streams_processed": len(streams_data),
209
+ "processing_mode": processing_mode,
210
+ "results": results,
211
+ "total_processing_time": time.time() - start_time,
212
+ "average_quality": round(np.mean([30, 45, 60, 55]), 1), # محاكاة متوسط الجودة
213
+ "nodes_utilized": len(set([r.get("processing_node", "main") for r in results.values()]))
214
+ }
215
+
216
+ logging.info(f"✅ تمت معالجة {len(streams_data)} بث - العقد المستخدمة: {result['nodes_utilized']}")
217
+ return result
218
+
219
+ # ═══════════════════════════════════════════════════════════════
220
+ # ذكاء اصطناعي للبث
221
+ # ═══════════════════════════════════════════════════════════════
222
+
223
+ @stream_offload
224
+ def ai_commentary_generation(game_events, commentary_length, language="ar"):
225
+ """توليد تعليق ذكي للألعاب"""
226
+ start_time = time.time()
227
+
228
+ logging.info(f"🤖 توليد تعليق ذكي - الطول: {commentary_length} كلمة")
229
+
230
+ # قوالب التعليق
231
+ commentary_templates = {
232
+ "ar": [
233
+ "حركة رائعة من اللاعب!",
234
+ "هذا هدف مذهل!",
235
+ "دفاع قوي في هذه اللحظة",
236
+ "استراتيجية ممتازة",
237
+ "أداء استثنائي!"
238
+ ],
239
+ "en": [
240
+ "Amazing move by the player!",
241
+ "What a fantastic goal!",
242
+ "Strong defense right there",
243
+ "Excellent strategy",
244
+ "Outstanding performance!"
245
+ ]
246
+ }
247
+
248
+ processing_time = commentary_length * 0.02 # 0.02 ثانية لكل كلمة
249
+ time.sleep(min(processing_time, 1))
250
+
251
+ # توليد التعليق
252
+ templates = commentary_templates.get(language, commentary_templates["ar"])
253
+ generated_commentary = []
254
+
255
+ for i in range(min(commentary_length // 5, len(game_events))):
256
+ template = np.random.choice(templates)
257
+ generated_commentary.append(template)
258
+
259
+ result = {
260
+ "status": "success",
261
+ "language": language,
262
+ "commentary_length": len(generated_commentary),
263
+ "generated_text": generated_commentary,
264
+ "game_events_analyzed": len(game_events),
265
+ "processing_time": time.time() - start_time,
266
+ "emotion_detection": "excited", # محاكاة كشف المشاعر
267
+ "context_awareness": True
268
+ }
269
+
270
+ logging.info(f"✅ تم توليد التعليق - {len(generated_commentary)} جملة")
271
+ return result
272
+
273
+ @stream_offload
274
+ def stream_quality_optimization(stream_metadata, target_bandwidth, viewer_count):
275
+ """تحسين جودة البث حسب النطاق الترددي وعدد المشاهدين"""
276
+ start_time = time.time()
277
+
278
+ logging.info(f"📊 تحسين جودة البث - المشاهدين: {viewer_count}")
279
+ logging.info(f"🌐 النطاق المستهدف: {target_bandwidth} Mbps")
280
+
281
+ # حساب الجودة المثلى
282
+ base_quality = min(target_bandwidth * 200, 1080) # حد أقصى 1080p
283
+
284
+ # تعديل حسب عدد المشاهدين
285
+ if viewer_count > 1000:
286
+ quality_adjustment = 0.8 # تقليل الجودة للأعداد الكبيرة
287
+ elif viewer_count > 100:
288
+ quality_adjustment = 0.9
289
+ else:
290
+ quality_adjustment = 1.0
291
+
292
+ optimized_quality = int(base_quality * quality_adjustment)
293
+
294
+ # تحديد FPS مناسب
295
+ if optimized_quality >= 1080:
296
+ optimal_fps = 60
297
+ elif optimized_quality >= 720:
298
+ optimal_fps = 45
299
+ else:
300
+ optimal_fps = 30
301
+
302
+ time.sleep(0.5) # محاكاة المعالجة
303
+
304
+ result = {
305
+ "status": "success",
306
+ "original_quality": stream_metadata.get("quality", "1080p"),
307
+ "optimized_quality": f"{optimized_quality}p",
308
+ "optimal_fps": optimal_fps,
309
+ "target_bandwidth": target_bandwidth,
310
+ "viewer_count": viewer_count,
311
+ "bandwidth_saved": round(max(0, (1080 - optimized_quality) / 1080 * 100), 1),
312
+ "processing_time": time.time() - start_time,
313
+ "adaptive_streaming": True
314
+ }
315
+
316
+ logging.info(f"✅ تم تحسين البث - الجودة: {result['optimized_quality']}")
317
+ return result
318
+
319
+ # ═══════════════════════════════════════════════════════════════
320
+ # إدارة البث المباشر
321
+ # ═══════════════════════════════════════════════════════════════
322
+
323
+ class LiveStreamCoordinator:
324
+ def __init__(self):
325
+ self.active_streams = {}
326
+ self.processing_history = []
327
+
328
+ def start_stream(self, stream_id, config):
329
+ """بدء بث مباشر جديد"""
330
+ self.active_streams[stream_id] = {
331
+ "config": config,
332
+ "start_time": datetime.now(),
333
+ "status": "active",
334
+ "processing_nodes": [],
335
+ "viewers": 0
336
+ }
337
+ logging.info(f"🔴 بدء البث: {stream_id}")
338
+
339
+ def distribute_processing(self, stream_id, task_type, data):
340
+ """توزيع معالجة البث على العقد المختلفة"""
341
+ if stream_id not in self.active_streams:
342
+ return {"error": "البث غير موجود"}
343
+
344
+ # اختيار العقدة المناسبة
345
+ best_node = self._select_processing_node(task_type)
346
+
347
+ # تنفيذ المعالجة
348
+ if best_node:
349
+ result = execute_remotely(task_type, [data], {})
350
+ self.active_streams[stream_id]["processing_nodes"].append(best_node)
351
+ return result
352
+ else:
353
+ # معالجة محلية
354
+ return self._process_locally(task_type, data)
355
+
356
+ def _select_processing_node(self, task_type):
357
+ """اختيار أفضل عقدة للمعالجة"""
358
+ # منطق اختيار العقدة (مبسط)
359
+ return f"node_gpu_{np.random.randint(1, 4)}"
360
+
361
+ def _process_locally(self, task_type, data):
362
+ """معالجة محلية احتياطية"""
363
+ return {"status": "processed_locally", "task": task_type}
364
+
365
+ # دالة اختبار شاملة للبث المباشر
366
+ def run_live_streaming_benchmark():
367
+ """اختبار شامل لنظام البث المباشر"""
368
+ print("\n📺🎮 اختبار نظام البث المباشر للألعاب والفيديو")
369
+ print("=" * 70)
370
+
371
+ # بيانات تجريبية
372
+ game_stream_data = [f"frame_{i}" for i in range(60)] # 60 إطار
373
+ game_events = ["goal", "save", "foul", "corner", "yellow_card"]
374
+
375
+ multi_streams = [
376
+ {"quality": "1080p", "fps": 60, "complexity": 3},
377
+ {"quality": "720p", "fps": 30, "complexity": 2},
378
+ {"quality": "1440p", "fps": 45, "complexity": 4}
379
+ ]
380
+
381
+ tests = [
382
+ ("معالجة بث لعبة", lambda: process_game_stream(game_stream_data, 60, "1920x1080", ["noise_reduction", "color_enhancement", "sharpening"])),
383
+ ("تحسين فيديو مباشر", lambda: real_time_video_enhancement(["upscaling", "noise_reduction", "hdr_enhancement"], "1080p", 60)),
384
+ ("معالجة متعددة البثوث", lambda: multi_stream_processing(multi_streams, "parallel")),
385
+ ("توليد تعليق ذكي", lambda: ai_commentary_generation(game_events, 50, "ar")),
386
+ ("تحسين جودة البث", lambda: stream_quality_optimization({"quality": "1080p"}, 5.0, 500))
387
+ ]
388
+
389
+ coordinator = LiveStreamCoordinator()
390
+
391
+ for test_name, test_func in tests:
392
+ print(f"\n🔄 تشغيل: {test_name}")
393
+ try:
394
+ result = test_func()
395
+ print(f"✅ نجح: {test_name}")
396
+ if "processing_time" in result:
397
+ print(f"⏱️ وقت المعالجة: {result['processing_time']:.2f}s")
398
+ if "quality_score" in result:
399
+ print(f"⭐ جودة: {result['quality_score']}%")
400
+ except Exception as e:
401
+ print(f"❌ فشل: {test_name} - {str(e)}")
402
+
403
+ print("\n🏁 انتهى اختبار البث المباشر")
404
+
405
+ if __name__ == "__main__":
406
+ run_live_streaming_benchmark()
load_balancer.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # load_balancer.py
2
+ import peer_discovery, requests, time, smart_tasks, psutil, socket
3
+ from peer_discovery import PORT
4
+
5
+ def send(peer, func, *args, **kw):
6
+ try:
7
+ r = requests.post(peer, json={"func": func,
8
+ "args": list(args),
9
+ "kwargs": kw}, timeout=12)
10
+ return r.json()
11
+ except Exception as e:
12
+ return {"error": str(e)}
13
+
14
+ def choose_peer():
15
+ """اختيار أفضل جهاز - أولوية LAN ثم WAN"""
16
+ import socket
17
+
18
+ lan_peers = []
19
+ wan_peers = []
20
+
21
+ # تصنيف الأجهزة
22
+ for p in list(peer_discovery.PEERS):
23
+ ip = p.split('//')[1].split(':')[0] if '//' in p else p.split(':')[0]
24
+ if is_local_ip(ip):
25
+ lan_peers.append(p)
26
+ else:
27
+ wan_peers.append(p)
28
+
29
+ # أولاً: جرب الأجهزة المحلية (LAN)
30
+ best_lan = find_best_peer(lan_peers)
31
+ if best_lan:
32
+ return best_lan
33
+
34
+ # ثانياً: إذا لم تتوفر أجهزة محلية، جرب WAN
35
+ if internet_available():
36
+ best_wan = find_best_peer(wan_peers)
37
+ return best_wan
38
+
39
+ return None
40
+
41
+ def find_best_peer(peers):
42
+ """العثور على أفضل جهاز من قائمة معينة"""
43
+ best = None
44
+ for p in peers:
45
+ try:
46
+ cpu = requests.get(p.replace("/run", "/cpu"), timeout=2).json()["usage"]
47
+ best = (p, cpu) if best is None or cpu < best[1] else best
48
+ except:
49
+ continue
50
+ return best[0] if best else None
51
+
52
+ def is_local_ip(ip):
53
+ """فحص إذا كان IP محلي"""
54
+ return (
55
+ ip.startswith('192.168.') or
56
+ ip.startswith('10.') or
57
+ ip.startswith('172.') or
58
+ ip == '127.0.0.1'
59
+ )
60
+
61
+ def internet_available():
62
+ """فحص توفر الإنترنت"""
63
+ try:
64
+ socket.create_connection(("8.8.8.8", 53), timeout=3)
65
+ return True
66
+ except:
67
+ return False
68
+
69
+ while True:
70
+ peer = choose_peer()
71
+ if peer:
72
+ print(f"\n🛰️ إرسال إلى {peer}")
73
+ res = send(peer, "prime_calculation", 30000)
74
+ else:
75
+ print("\n⚙️ لا أقران؛ العمل محليّ على", socket.gethostname())
76
+ res = smart_tasks.prime_calculation(30000)
77
+ print("🔹 النتيجة (جزئية):", str(res)[:120])
78
+ time.sleep(10)
main.py ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import os
3
+ import json
4
+ import subprocess
5
+ import shutil
6
+ import socket
7
+ import time
8
+ import telegram_listener
9
+ HISTORY_PATH = "history.json"
10
+
11
+ # ترتيب تفضيلي للنماذج (سنختار أول نموذج متاح منها)
12
+ PREFERRED_MODELS = [
13
+ "nous-hermes2", # مفضل أولاً إذا كان منصّباً
14
+ os.getenv("OLLAMA_MODEL", "mistral:instruct"),
15
+ "mistral:latest",
16
+ "gemma3:4b",
17
+ "tinyllama:latest",
18
+ "tinyllama-lite:latest",
19
+ "qwen2-0.5b-lite:latest",
20
+ "qwen2:0.5b",
21
+ "tinyllama:latest",
22
+ "llama3.2:1b"
23
+ ]
24
+
25
+ # استيراد آمن لملف responses.py
26
+ try:
27
+ from responses import generate_reply as _generate_reply
28
+ except Exception:
29
+ def _generate_reply(*args, **kwargs):
30
+ return None
31
+
32
+
33
+ def ensure_ollama():
34
+ """
35
+ يتحقّق من توفّر ollama CLI (باستخدام --version) ويضمن أن السيرفر شغّال.
36
+ لو السيرفر غير شغّال، يشغّله وينتظر جاهزيته.
37
+ """
38
+ # استخدم المسار المباشر أولاً لتجنّب أي shadow لملف باسم 'ollama' داخل المشروع
39
+ win_exe = r"C:\Users\osamawin\AppData\Local\Programs\Ollama\ollama.exe"
40
+ cli = win_exe if os.path.exists(win_exe) else shutil.which("ollama")
41
+ if not cli:
42
+ raise RuntimeError("ollama CLI غير موجود. ثبّته أو أضِفه للـ PATH.")
43
+
44
+ # تأكّد من الـ CLI
45
+ try:
46
+ subprocess.run([cli, "--version"], check=True,
47
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
48
+ except Exception as e:
49
+ raise RuntimeError("تعذّر تشغيل 'ollama --version'. تأكّد من التثبيت.") from e
50
+
51
+ # تحقّق من أن السيرفر يستمع؛ استخدم OLLAMA_HOST إن وُجد وإلا الافتراضي 127.0.0.1:11434
52
+ host = os.environ.get("OLLAMA_HOST", "127.0.0.1:11434")
53
+ ip, port = host.split(":")
54
+ port = int(port)
55
+
56
+ def _is_up():
57
+ try:
58
+ with socket.create_connection((ip, port), timeout=0.8):
59
+ return True
60
+ except OSError:
61
+ return False
62
+
63
+ if _is_up():
64
+ return
65
+
66
+ # شغّل السيرفر في الخلفية
67
+ cmd = [cli, "serve"]
68
+ if "OLLAMA_HOST" in os.environ:
69
+ cmd += ["--host", host]
70
+ subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
71
+
72
+ # انتظر الجاهزية (TCP)
73
+ for _ in range(60):
74
+ if _is_up():
75
+ return
76
+ time.sleep(0.2)
77
+
78
+ raise RuntimeError(f"فشل تشغيل ollama serve على {host}.")
79
+
80
+
81
+ def list_installed_models():
82
+ """
83
+ يرجع قائمة أسماء النماذج المنصّبة محلياً عبر 'ollama list'.
84
+ """
85
+ try:
86
+ out = subprocess.run(
87
+ ["ollama", "list"],
88
+ check=True,
89
+ stdout=subprocess.PIPE,
90
+ stderr=subprocess.PIPE,
91
+ text=True
92
+ ).stdout
93
+ except subprocess.CalledProcessError as e:
94
+ raise RuntimeError(f"خطأ عند قراءة قائمة النماذج: {e.stderr.strip() or e.stdout.strip()}")
95
+
96
+ models = []
97
+ for line in out.splitlines():
98
+ line = line.strip()
99
+ if not line or line.startswith("NAME") or line.startswith("-"):
100
+ continue
101
+ # السطر يبدأ بـ NAME ثم أعمدة أخرى، ناخذ أول عمود
102
+ parts = line.split()
103
+ if parts:
104
+ models.append(parts[0])
105
+ return models
106
+
107
+
108
+ def pick_default_model(installed):
109
+ for m in PREFERRED_MODELS:
110
+ if m in installed:
111
+ return m
112
+ if installed:
113
+ return installed[0]
114
+ raise RuntimeError("لا توجد نماذج منصّبة في Ollama. ثبّت نموذجاً أولاً (مثلاً: ollama pull mistral:instruct).")
115
+
116
+
117
+ def ollama_generate(model, prompt, timeout=120):
118
+ """
119
+ يستدعي: ollama run <model> "<prompt>"
120
+ (بدون -p لأن إصدارك لا يدعمه)
121
+ """
122
+ try:
123
+ res = subprocess.run(
124
+ ["ollama", "run", model, prompt], # ← لا تستخدم -p
125
+ check=False,
126
+ stdout=subprocess.PIPE,
127
+ stderr=subprocess.PIPE,
128
+ text=True,
129
+ timeout=timeout,
130
+ )
131
+ out = (res.stdout or "").strip()
132
+ err = (res.stderr or "").strip()
133
+
134
+ if res.returncode != 0:
135
+ raise RuntimeError(err or out or "خروج غير صفري من ollama")
136
+
137
+ if not out:
138
+ raise RuntimeError(f"{model} لم يرجّع أي مخرجات.")
139
+
140
+ return out
141
+ except subprocess.TimeoutExpired:
142
+ raise RuntimeError(f"انتهى الوقت المحدد لطلب النموذج ({model}). جرّب لاحقاً أو خفّض طول البرومبت.")
143
+
144
+
145
+ def load_history():
146
+ if os.path.exists(HISTORY_PATH):
147
+ with open(HISTORY_PATH, "r", encoding="utf-8") as f:
148
+ return json.load(f)
149
+ return []
150
+
151
+
152
+ def save_history(history):
153
+ with open(HISTORY_PATH, "w", encoding="utf-8") as f:
154
+ json.dump(history, f, ensure_ascii=False, indent=2)
155
+
156
+
157
+ def simulate_server_scan():
158
+ print("نورا: أبحث عن خوادم...")
159
+ fake_servers = ["192.168.1.5", "192.168.1.10", "192.168.1.20"]
160
+ for server in fake_servers:
161
+ print(f"نورا: تم العثور على خادم مفتوح في {server}")
162
+
163
+
164
+ def format_chat_prompt(history, user_utterance):
165
+ """
166
+ نبني برومبت بسيط يحافظ على سياق مختصر.
167
+ يمكنك تطويره لاحقاً لتنسيق ChatML أو JSON حسب النموذج.
168
+ """
169
+ system = "أنت المساعدة نورا. تحدثي بلغة عربية فصحى بسيطة."
170
+ lines = [f"system: {system}"]
171
+ for msg in history[-6:]: # آخر 6 رسائل فقط لتقليل الطول
172
+ role = msg.get("role", "user")
173
+ content = msg.get("content", "")
174
+ lines.append(f"{role}: {content}")
175
+ lines.append(f"user: {user_utterance}")
176
+ lines.append("assistant:")
177
+ return "\n".join(lines)
178
+
179
+
180
+ def chat():
181
+ ensure_ollama()
182
+ installed = list_installed_models()
183
+ active_model = pick_default_model(installed)
184
+
185
+ chat_history = load_history()
186
+
187
+ print(f"""
188
+ نظام نورا الذكي (Ollama)
189
+ النموذج الحالي: {active_model}
190
+
191
+ أوامر خاصة:
192
+ - /models : عرض النماذج المنصّبة
193
+ - /model NAME : تبديل النموذج (مثال: /model mistral:instruct)
194
+ - scan : مسح الشبكة (محاكاة)
195
+ - خروج | exit | quit : إنهاء المحادثة
196
+ """)
197
+
198
+ while True:
199
+ try:
200
+ user_input = input("أنت: ").strip()
201
+ if not user_input:
202
+ continue
203
+
204
+ low = user_input.lower()
205
+ if low in ["خروج", "exit", "quit"]:
206
+ break
207
+
208
+ if low == "scan":
209
+ simulate_server_scan()
210
+ continue
211
+
212
+ if low == "/models":
213
+ print("النماذج المتاحة محلياً:")
214
+ for m in installed:
215
+ print(" -", m)
216
+ continue
217
+
218
+ if low.startswith("/model"):
219
+ # صيغة: /model NAME
220
+ parts = user_input.split(maxsplit=1)
221
+ if len(parts) == 1:
222
+ print(f"النموذج الحالي: {active_model}")
223
+ continue
224
+ candidate = parts[1].strip()
225
+ if candidate not in installed:
226
+ print(f"⚠️ النموذج '{candidate}' غير منصّب. النماذج المتاحة: {', '.join(installed)}")
227
+ continue
228
+ active_model = candidate
229
+ print(f"✅ تم تبديل النموذج إلى: {active_model}")
230
+ continue
231
+
232
+ # أولاً: ردود مخصصة من responses.py إن توفرت
233
+ custom_reply = None
234
+ try:
235
+ r = _generate_reply(user_input, username="أسامة")
236
+ # تجاهل رسالة الخطأ الجاهزة كي لا توقف تدفق الرد من النموذج
237
+ if r and not r.strip().startswith("عذراً، حدث خطأ"):
238
+ custom_reply = r
239
+ except Exception:
240
+ custom_reply = None
241
+
242
+ if custom_reply is not None:
243
+ print("نورا:", custom_reply)
244
+ chat_history.append({"role": "user", "content": user_input})
245
+ chat_history.append({"role": "assistant", "content": custom_reply})
246
+ if len(chat_history) % 3 == 0:
247
+ save_history(chat_history)
248
+ continue
249
+
250
+ # إذا لا يوجد رد مخصص → نستخدم النموذج النشط عبر Ollama
251
+ chat_history.append({"role": "user", "content": user_input})
252
+ prompt = format_chat_prompt(chat_history, user_input)
253
+ print("نورا: أفكر... (", active_model, ")")
254
+ try:
255
+ model_reply = ollama_generate(active_model, prompt)
256
+ except RuntimeError as e:
257
+ # فشل؟ جرّب بدائل بالتتابع مع طباعة سبب الفشل
258
+ print(f"⚠️ فشل مع {active_model}: {e}\n🔁 أجرب بدائل...")
259
+ fallback = None
260
+ for m in PREFERRED_MODELS:
261
+ if m in installed and m != active_model:
262
+ try:
263
+ print(f"→ تجربة {m} ...")
264
+ model_reply = ollama_generate(m, prompt)
265
+ fallback = m
266
+ break
267
+ except Exception as ee:
268
+ print(f" × فشل {m}: {ee}")
269
+ continue
270
+ if fallback is None:
271
+ print("نورا: حدث خطأ:", str(e))
272
+ continue
273
+ else:
274
+ active_model = fallback
275
+ print(f"✅ تم التبديل تلقائياً إلى: {active_model}")
276
+
277
+ # غالباً المخرجات ستكون مجرد نص رد
278
+ assistant_response = model_reply.strip()
279
+ print("نورا:", assistant_response)
280
+ chat_history.append({"role": "assistant", "content": assistant_response})
281
+
282
+ # احفظ كل 3 رسائل لتقليل الكتابة
283
+ if len(chat_history) % 3 == 0:
284
+ save_history(chat_history)
285
+
286
+ except KeyboardInterrupt:
287
+ print("\nنورا: تم إنهاء المحادثة.")
288
+ break
289
+ except Exception as e:
290
+ print(f"نورا: حدث خطأ: {str(e)}")
291
+ continue
292
+
293
+ # حفظ السجل النهائي عند الخروج
294
+ save_history(chat_history)
295
+
296
+
297
+ if __name__ == "__main__":
298
+ chat()
mainphone.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import flet as ft
2
+ import speech_recognition as sr
3
+ import threading
4
+
5
+ # قاعدة بيانات مؤقتة لحفظ الأوامر المتكررة
6
+ class CommandMemory:
7
+ def __init__(self):
8
+ self.learned_commands = {}
9
+
10
+ def learn(self, command):
11
+ self.learned_commands[command] = self.learned_commands.get(command, 0) + 1
12
+ print(f"[تعلم] '{command}' - عدد مرات الاستخدام: {self.learned_commands[command]}")
13
+
14
+ def count(self, command):
15
+ return self.learned_commands.get(command, 0)
16
+
17
+ # الذكاء الأساسي للتعامل مع الأوامر
18
+ class NoraBrain:
19
+ def __init__(self, memory: CommandMemory):
20
+ self.memory = memory
21
+
22
+ def reply(self, command):
23
+ command = command.strip().lower()
24
+ if "فتح" in command and "الكاميرا" in command:
25
+ return "جارٍ فتح الكاميرا الآن."
26
+ elif "تشغيل" in command and "الموسيقى" in command:
27
+ return "تشغيل الموسيقى بأعلى جودة."
28
+ elif "اتصال" in command:
29
+ return "من الشخص الذي ترغب في الاتصال به؟"
30
+ elif self.memory.count(command) > 0:
31
+ return f"لقد استخدمت هذا الأمر {self.memory.count(command)} مرّات."
32
+ else:
33
+ return "عذرًا، لم أفهم الأمر. هل يمكنك المحاولة بصيغة أخرى؟"
34
+
35
+ # مسؤول عن التعامل مع الصوت وتشغيل الردود
36
+ class VoiceController:
37
+ def __init__(self, brain: NoraBrain, page: ft.Page):
38
+ self.recognizer = sr.Recognizer()
39
+ self.microphone = sr.Microphone()
40
+ self.page = page
41
+ self.brain = brain
42
+
43
+ def listen_loop(self):
44
+ with self.microphone as source:
45
+ self.recognizer.adjust_for_ambient_noise(source)
46
+ print("[النظام] تم ضبط حساسية الميكروفون.")
47
+
48
+ while True:
49
+ try:
50
+ with self.microphone as source:
51
+ print("[استماع] في انتظار أمر صوتي...")
52
+ audio = self.recognizer.listen(source)
53
+
54
+ command = self.recognizer.recognize_google(audio, language="ar-AR").lower()
55
+ print(f"[أمر صوتي] تم التقاط: {command}")
56
+
57
+ self.brain.memory.learn(command)
58
+ response = self.brain.reply(command)
59
+
60
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(f"أمر صوتي: {command}", color="blue")))
61
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(f"رد نورا: {response}", color="green")))
62
+
63
+ except Exception as e:
64
+ error_text = f"[خطأ] مشكلة في التعرف على الصوت: {e}"
65
+ print(error_text)
66
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(error_text, color="red")))
67
+
68
+ # الواجهة الرئيسية
69
+ def main(page: ft.Page):
70
+ page.title = "نورا فون - مساعد صوتي عربي"
71
+ page.vertical_alignment = ft.MainAxisAlignment.START
72
+ page.padding = 20
73
+ page.scroll = "auto"
74
+
75
+ page.add(ft.Text("مرحبًا بك في تطبيق نورا فون!", size=24, weight=ft.FontWeight.BOLD, color="purple"))
76
+ page.add(ft.Text("تحدث بالأوامر الصوتية للتحكم بالتطبيق.\nمثال: 'افتح الكاميرا' أو 'شغّل الموسيقى'.", size=16))
77
+
78
+ memory = CommandMemory()
79
+ brain = NoraBrain(memory)
80
+ controller = VoiceController(brain, page)
81
+
82
+ threading.Thread(target=controller.listen_loop, daemon=True).start()
83
+
84
+ # تشغيل التطبيق
85
+ ft.app(target=main, view=ft.AppView.WEB_BROWSER)
media_analyzer.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import requests
3
+ from PIL import Image
4
+ import pytesseract
5
+ import io
6
+ import speech_recognition as sr
7
+ import os
8
+ import uuid
9
+
10
+ try:
11
+ import moviepy.editor as mp
12
+ MOVIEPY_AVAILABLE = True
13
+ except ImportError:
14
+ print("Warning: moviepy not available, video analysis will be limited")
15
+ MOVIEPY_AVAILABLE = False
16
+
17
+ def analyze_image_from_url(url):
18
+ try:
19
+ response = requests.get(url, timeout=10)
20
+ image = Image.open(io.BytesIO(response.content))
21
+ text = pytesseract.image_to_string(image, lang='eng+ara')
22
+ return text.strip() if text.strip() else "لم يتم العثور على نص في الصورة"
23
+ except Exception as e:
24
+ return f"خطأ في تحليل الصورة: {str(e)}"
25
+
26
+ def analyze_audio_from_url(url):
27
+ try:
28
+ audio_path = f"temp_{uuid.uuid4().hex}.mp3"
29
+ with open(audio_path, 'wb') as f:
30
+ f.write(requests.get(url, timeout=15).content)
31
+
32
+ recognizer = sr.Recognizer()
33
+ with sr.AudioFile(audio_path) as source:
34
+ audio_data = recognizer.record(source)
35
+ text = recognizer.recognize_google(audio_data, language="ar")
36
+ os.remove(audio_path)
37
+ return text
38
+ except Exception as e:
39
+ return f"تحليل الصوت فشل: {str(e)}"
40
+
41
+ def analyze_video_from_url(url):
42
+ if not MOVIEPY_AVAILABLE:
43
+ return "تحليل الفيديو غير متاح حالياً"
44
+
45
+ try:
46
+ video_path = f"temp_{uuid.uuid4().hex}.mp4"
47
+ audio_path = f"temp_{uuid.uuid4().hex}.wav"
48
+
49
+ with open(video_path, 'wb') as f:
50
+ f.write(requests.get(url, timeout=20).content)
51
+
52
+ clip = mp.VideoFileClip(video_path)
53
+ clip.audio.write_audiofile(audio_path, codec='pcm_s16le')
54
+
55
+ recognizer = sr.Recognizer()
56
+ with sr.AudioFile(audio_path) as source:
57
+ audio_data = recognizer.record(source)
58
+ text = recognizer.recognize_google(audio_data, language="ar")
59
+
60
+ os.remove(video_path)
61
+ os.remove(audio_path)
62
+ return text
63
+ except Exception as e:
64
+ return f"تحليل الفيديو فشل: {str(e)}"
65
+ import requests
66
+ from PIL import Image
67
+ import pytesseract
68
+ import io
69
+ import speech_recognition as sr
70
+ import os
71
+ import uuid
72
+ import logging
73
+
74
+ # إعداد سجل الأخطاء
75
+ logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')
76
+
77
+ # التحقق من توفر مكتبة moviepy
78
+ try:
79
+ import moviepy.editor as mp
80
+ MOVIEPY_AVAILABLE = True
81
+ except ImportError:
82
+ logging.warning("moviepy غير متوفرة، سيتم تعطيل تحليل الفيديو")
83
+ MOVIEPY_AVAILABLE = False
84
+
85
+
86
+ class MediaAnalyzer:
87
+ def __init__(self, lang='eng+ara'):
88
+ self.lang = lang
89
+
90
+ def _download_file(self, url, extension):
91
+ try:
92
+ response = requests.get(url, timeout=20)
93
+ response.raise_for_status()
94
+ file_path = f"temp_{uuid.uuid4().hex}.{extension}"
95
+ with open(file_path, 'wb') as f:
96
+ f.write(response.content)
97
+ return file_path
98
+ except Exception as e:
99
+ logging.error(f"فشل تحميل الملف: {e}")
100
+ return None
101
+
102
+ def analyze_image_from_url(self, url):
103
+ try:
104
+ response = requests.get(url, timeout=10)
105
+ image = Image.open(io.BytesIO(response.content))
106
+ text = pytesseract.image_to_string(image, lang=self.lang)
107
+ return text.strip() if text.strip() else "لم يتم العثور على نص في الصورة"
108
+ except Exception as e:
109
+ logging.error(f"خطأ في تحليل الصورة: {e}")
110
+ return f"خطأ في تحليل الصورة: {str(e)}"
111
+
112
+ def analyze_audio_from_url(self, url):
113
+ audio_path = self._download_file(url, "mp3")
114
+ if not audio_path:
115
+ return "فشل تحميل الصوت"
116
+ try:
117
+ recognizer = sr.Recognizer()
118
+ with sr.AudioFile(audio_path) as source:
119
+ audio_data = recognizer.record(source)
120
+ text = recognizer.recognize_google(audio_data, language="ar")
121
+ return text
122
+ except Exception as e:
123
+ logging.error(f"تحليل الصوت فشل: {e}")
124
+ return f"تحليل الصوت فشل: {str(e)}"
125
+ finally:
126
+ if os.path.exists(audio_path):
127
+ os.remove(audio_path)
128
+
129
+ def analyze_video_from_url(self, url):
130
+ if not MOVIEPY_AVAILABLE:
131
+ return "تحليل الفيديو غير متاح حالياً"
132
+
133
+ video_path = self._download_file(url, "mp4")
134
+ if not video_path:
135
+ return "فشل تحميل الفيديو"
136
+
137
+ audio_path = f"temp_{uuid.uuid4().hex}.wav"
138
+ try:
139
+ with mp.VideoFileClip(video_path) as clip:
140
+ clip.audio.write_audiofile(audio_path, codec='pcm_s16le')
141
+ recognizer = sr.Recognizer()
142
+ with sr.AudioFile(audio_path) as source:
143
+ audio_data = recognizer.record(source)
144
+ text = recognizer.recognize_google(audio_data, language="ar")
145
+ return text
146
+ except Exception as e:
147
+ logging.error(f"تحليل الفيديو فشل: {e}")
148
+ return f"تحليل الفيديو فشل: {str(e)}"
149
+ finally:
150
+ for path in [video_path, audio_path]:
151
+ if os.path.exists(path):
152
+ os.remove(path)
153
+
memory.py ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # memory.py
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ ذاكرة المستخدم/العامة + قاعدة المعرفة في ملف واحد، بدون أي استيراد عكسي (circular import).
5
+ يوفّر:
6
+ - load_memory(user_id) / save_memory(user_id, data)
7
+ - load_global_memory() / save_global_memory(data)
8
+ - load_knowledge_base() / save_knowledge_base(data)
9
+ - learn_from_unknown(prompt) / update_knowledge_base(prompt, answer)
10
+ """
11
+
12
+ from __future__ import annotations
13
+ import json
14
+ import os
15
+ import tempfile
16
+ import threading
17
+ from typing import Any, Dict
18
+
19
+ # ========= مسارات التخزين =========
20
+ BASE_DIR = os.path.abspath(os.path.dirname(__file__))
21
+
22
+ # مجلد بيانات الذاكرة
23
+ DATA_DIR = os.path.join(BASE_DIR, "data")
24
+ os.makedirs(DATA_DIR, exist_ok=True)
25
+
26
+ # ملفات الذاكرة
27
+ GLOBAL_MEMORY_FILE = os.path.join(DATA_DIR, "global_memory.json")
28
+ USER_MEMORY_PREFIX = "memory_" # memory_<user_id>.json
29
+
30
+ # ملف قاعدة المعرفة (متوافق مع نسختك السابقة)
31
+ knowledge_base_path = os.path.join(BASE_DIR, "knowledge_base.json")
32
+
33
+ # قفل للتزامن
34
+ _lock = threading.RLock()
35
+
36
+ # ========= أدوات JSON آمنة =========
37
+ def _safe_write_json(path: str, data: Dict[str, Any]) -> None:
38
+ """
39
+ كتابة ذرّية لضمان عدم تلف الملف حتى مع انقطاع مفاجئ.
40
+ """
41
+ with _lock:
42
+ os.makedirs(os.path.dirname(path), exist_ok=True)
43
+ fd, tmp_path = tempfile.mkstemp(prefix=".tmp_", dir=os.path.dirname(path))
44
+ try:
45
+ with os.fdopen(fd, "w", encoding="utf-8") as f:
46
+ json.dump(data, f, ensure_ascii=False, indent=2)
47
+ f.flush()
48
+ os.fsync(f.fileno())
49
+ os.replace(tmp_path, path)
50
+ finally:
51
+ if os.path.exists(tmp_path):
52
+ try:
53
+ os.remove(tmp_path)
54
+ except OSError:
55
+ pass
56
+
57
+ def _read_json(path: str) -> Dict[str, Any]:
58
+ """
59
+ قراءة JSON بأمان. يعيد dict فارغ عند عدم وجود الملف أو في حال تلفه.
60
+ """
61
+ with _lock:
62
+ if not os.path.exists(path):
63
+ return {}
64
+ try:
65
+ with open(path, "r", encoding="utf-8") as f:
66
+ return json.load(f)
67
+ except Exception:
68
+ return {}
69
+
70
+ def _user_file(user_id: str) -> str:
71
+ """
72
+ تكوين اسم ملف آمن للمستخدم.
73
+ """
74
+ safe_id = "".join(ch for ch in str(user_id) if ch.isalnum() or ch in ("-", "_")) or "default"
75
+ return os.path.join(DATA_DIR, f"{USER_MEMORY_PREFIX}{safe_id}.json")
76
+
77
+ # ========= واجهة الذاكرة (لـ learner.py) =========
78
+ def load_memory(user_id: str) -> Dict[str, Any]:
79
+ """
80
+ قراءة ذاكرة مستخدم (dict).
81
+ """
82
+ return _read_json(_user_file(user_id))
83
+
84
+ def save_memory(user_id: str, data: Dict[str, Any]) -> None:
85
+ """
86
+ حفظ ذاكرة مستخدم (dict).
87
+ """
88
+ if not isinstance(data, dict):
89
+ raise TypeError("save_memory expects a dict")
90
+ _safe_write_json(_user_file(user_id), data)
91
+
92
+ def load_global_memory() -> Dict[str, Any]:
93
+ """
94
+ قراءة الذاكرة العامة (dict).
95
+ """
96
+ return _read_json(GLOBAL_MEMORY_FILE)
97
+
98
+ def save_global_memory(data: Dict[str, Any]) -> None:
99
+ """
100
+ حفظ الذاكرة العامة (dict).
101
+ """
102
+ if not isinstance(data, dict):
103
+ raise TypeError("save_global_memory expects a dict")
104
+ _safe_write_json(GLOBAL_MEMORY_FILE, data)
105
+
106
+ # ========= واجهة قاعدة المعرفة (متوافقة مع نسختك السابقة) =========
107
+ def load_knowledge_base() -> Dict[str, Any]:
108
+ return _read_json(knowledge_base_path)
109
+
110
+ def save_knowledge_base(data: Dict[str, Any]) -> None:
111
+ if not isinstance(data, dict):
112
+ raise TypeError("save_knowledge_base expects a dict")
113
+ _safe_write_json(knowledge_base_path, data)
114
+
115
+ def learn_from_unknown(prompt: str):
116
+ """
117
+ نفس السلوك السابق: يطبع رسالة ويطلب إجابة ليتم تعلمها.
118
+ """
119
+ print("نورا: لا أملك إجابة لهذا السؤال حاليًا. سأبحث عن إجابة وأتعلم.")
120
+ answer = input("يرجى تزويدي بالإجابة المناسبة لأتعلمها: ")
121
+ if answer and answer.strip():
122
+ return answer
123
+ return None
124
+
125
+ def update_knowledge_base(prompt: str, answer: str) -> None:
126
+ kb = load_knowledge_base()
127
+ kb[prompt] = answer
128
+ save_knowledge_base(kb)
129
+
130
+ # ========= تصدير الأسماء =========
131
+ __all__ = [
132
+ "load_memory", "save_memory", "load_global_memory", "save_global_memory",
133
+ "load_knowledge_base", "save_knowledge_base",
134
+ "learn_from_unknown", "update_knowledge_base",
135
+ ]
136
+
137
+ # ========= اختبار سريع =========
138
+ if __name__ == "__main__":
139
+ uid = "osama"
140
+
141
+ # اختبار ذاكرة المستخدم/العامة
142
+ u = load_memory(uid)
143
+ u["counter"] = u.get("counter", 0) + 1
144
+ save_memory(uid, u)
145
+
146
+ g = load_global_memory()
147
+ g["last_user"] = uid
148
+ save_global_memory(g)
149
+
150
+ print("User memory:", load_memory(uid))
151
+ print("Global memory:", load_global_memory())
152
+
153
+ # اختبار قاعدة المعرفة
154
+ update_knowledge_base("ما هي نورا؟", "مساعد ذكي")
155
+ print("KB size:", len(load_knowledge_base()))
memory_1421046090.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Sex": "",
3
+ "Nude": "",
4
+ "Naked": "",
5
+ "pkg clean; pkg install git -y\nexport PIP_CACHE_DIR=$HOME/storage/downloads/pip_cache\npip install git+https://github.com/pytorch/executorch.git --no-cache-dir": "",
6
+ "Test noura": "",
7
+ "https://www.youtube.com/live/cVVTw-UYBNk?si=0AlEUKKYyUQectpY": "",
8
+ "????????????": "",
9
+ "Hi": "",
10
+ "What is your name?": "",
11
+ "t.me/StarsovEarnBot?start=FhBnJY1yd": "",
12
+ "https://web.facebook.com/reel/729413673415087": "",
13
+ "https://www.youtube.com/@JordanRec-job": "",
14
+ "https://youtu.be/FGXSg7RZlOg?feature=shared": "",
15
+ "https://youtu.be/fRBQ_e9lHJc?si=UAPB4UK5C6IohPbK": "",
16
+ "https://jordanrec.com/archives/142338": "",
17
+ "مرحبا": "وجدت هذه النتائج داخل المشروع:\n\n📄 core.py:12\n return f\"سؤال رائع! دعني أفكر في: {message}\"\n \n if any(word in message for word in ['مرحبا', 'السلام', 'أهلاً']):\n return \"أهلاً بك! كيف يمكنني مساعدتك اليوم؟\"\n \n\n📄 history.json:28\n {\n \"role\": \"user\",\n \"content\": \"مرحبا\"\n },\n {\n\n📄 history.json:36\n {\n \"role\": \"user\",\n \"content\": \"مرحبا\"\n },\n {\n",
18
+ "كيف حالك": "وجدت هذه النتائج داخل المشروع:\n\n📄 global_memory.json:22\n \"تعال نيكني\": \"رد تلقائي: ينكين لاعت\",\n \"شو اسمك؟\": \"رد تلقائي: ؟كمسا وش\",\n \"osama dawood: ان تدعم المسجد ثم تحارب مبادئ هذا المسجد هذا النفاق Marin: ولذلك لا يوجد أي محظورات على الزواج الإسلامي. osama dawood: في مدى التاريخ الاسلامي لم يتدخل الحكم الاسلامي فيكا يحدث داخل الكنائس Marin: الدولة لا تقاتل osama dawood: او فيما يحدث داخل البيوت كان دائما يتعامل مع الافعال في الطريق دينك يسمحلك تشرب الخمر؟؟ اشربه في البيت وليس في الشارع Marin: أنت لا تفهم ما يحدث في روسيا. أنت تحكم بشكل خاطئ. osama dawood: دولة علمانية بطابع مسيحي كيف لا افهم Marin: نحن نمنع شرب الكحول في الشارع. وفقًا للقانون، يتم فرض غرامة أو عمل إصلاحي osama dawood: محاكم التفتيش في الاندلس قامت بحركة تشبه ما يفعله العلمانيون اليوم وهي رفع لحم الخنزير بيد واليد الاخرى فيها سيف اما ان تخالف الإسلام وتأكل الخنزير او يتم قتلك Marin: ديني يمنعني من ...",
19
+ "1+1=?": "إجابة مختصرة من المعرفة المحلية:\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
20
+ "طيز": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
21
+ "بزاز": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
22
+ "ارسمي بزازك": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
23
+ "ما اسمك": "مرحبا، كيف يمكنني مساعدتك اليوم؟",
24
+ "ارسمي": "مرحبا، كيف يمكنني مساعدتك اليوم؟"
25
+ }
memory_777000.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "الصفحة مهددة بالاغلاقمتابعات | تهجير غزة وإسرائيل الكبرى وحل الدولتين\nنعلّق على ثلاثة تطورات في أزمة ومأساة قطاع غزة: إصرار نتنياهو على اكتساح القطاع وتهجير أهله بالرغم من كل التنديد الدولي، وصدور تصريحات واضحة من الاحتلال بأن هدفهم هو \"إسرائيل الكبرى\" التي لا تعترف بحدودها الحالية وتسعى للتوسع على حساب الدول المطبعة معها، وحل الدولتين الذي تحاول الدول العربية والأوروبية التوصل له بينما يعلن الاحتلال رفضه التام.إعداد وتقديم أحمد دعدوش:https://ift.tt/NL4a8jthttps://ift.tt/YNPE1Gbشكرًا على تفاعلكم الذي يساهم في نشر أعمالنا ويحقق رسالتنا في زيادة الوعي.==========================بدعمكم نستمر========لدعم مشروع السبيل مالياً عبر باتريون:http://bit.ly/alsabeel-patreonللدعم عبر باي بال:paypal.me/alsabeelwebللدعم عبر فيسبوك:http://bit.ly/Become-a-supporter========تابعوا صفحتنا الدولية Al-Sabeel International وحدثوا عنها أصدقاءكم من غير العرب:https://ift.tt/EYgxIZw========لاستكشاف موسوعة السبيل والمزيد من المقالات المتجددة زوروا موقعنا: http://bit.ly/alsabeel-website ========السبيل على منصات التواصل الاجتماعي:فيسبوكhttp://bit.ly/alsabeel-facebookتويترhttp://bit.ly/alsabeel-twitterانستغرامhttp://bit.ly/alsabeel-instagramتيليغرامhttp://bit.ly/alsabeel-telegramتيكتوكhttps://bit.ly/AlSabeelTikTok\nvia YouTube https://www.youtube.com/watch?v=-kZVr0IyjrU\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20",
3
+ "الصفحة مهددة بالاغلاقأسماء سعيد - نفس مطمئنة | شهادات مزيفة وكيانات وهمية! | أدلة جديدة\n#الأسماء_الحسنى #صحة_نفسية #صحة_نفسية #علاقات_اسرية #الزواج #جذب_شريك_الحياة #القرآن_الكريم #قانون_الجذب #توأم_الشعلة #الزوهرى #الاسقاط_النجمي #الطاقة_الإيجابية #طاقة_الأنوثة رابط حساب الباتريون للمساهمة في دعم برنامج قرار إزالة:https://ift.tt/noryKe0=======كيفية تقديم الدعم عبر باتريون ؟* Become a Patreon أضغط على الزر في أعلى الصفحة* أختر المبلغ الذي تريد الدعم به* أختر وسيلة الدفع المناسبة لك إما من خلال الكارت الخاص بك أو من خلال الباي بال* قم بادخال بيانات الكارت الخاص بك* Continue ثم أضغط على=======ملحوظتين في غاية الأهمية:* الموقع آمن جدًا وهو موقع عالمي معترف به من الحكومة الأميريكية وغيرها فلا تخف على بياناتك* إذا كنت تقوم بدعمنا لأول مرة، فإن الموقع سيقوم بسحب مبلغ الدعم لهذا الشهر فوراً، وهذا من أجل التأكد من صحة بياناتك، وعند بداية الشهر الميلادي الجديد، سيقوم الموقع بسحب نفس مبلغ الدعم المحدد، وهكذا شهرياً في بداية كل شهر ميلادي سيتم دعمنا بالمبلغ الذي اخترته، فإذا كنت تريد دعمنا بمبلغ معين لمرة واحدة، فيمكنك الغاء اشتراك الدعم في أي وقت قبل بداية الشهر الميلادي الجديد، أو يمكنك الاستمرار بدعمنا بشكل شهري، وإذا كنت تريد الدعم بمبلغ شهري متغير فيمكن لك أن تفعل هذه العملية كل شهر وبعد سحب المبلغ تقوم بإلغاء إشتراكك في هذا الشهر ثم إعادة الإشتراك مرة أخرى في الشهر الذي يليه وهكذا.=====================برنامج \" قرار إزالة \" هو برنامج للرد و التعليق على ما يثيره بعض الأشخاص من شبهات حول الإسلام . في كل حلقة نتناول بعض شبهات شخص أو أكثر بالنقد و التفنيد و بيان مواضع الخطأ - في حالة وجود خطأ - أو الكذب و ال��دليس - في حالة وجود كذب أو تدليس - و نحرص على عرض كلام الشخص (( موثقًا بالفيديو )) قبل التعليق عليه و تفنيده لمزيد من الشفافية و الوضوح .في حلقاتنا نلتزم بالرد المدعم بالأدلة و البراهين النقلية و العقلية .. و كثيراً ما نعتمد في نقدنا على كلام الشخص صاحب الشبهة نفسه موثقًا بالفيديو أيضًا .و دائماً و أبداً يبقى حق الاختلاف و الرد مكفول للجميعالبرنامج كذلك يكشف حقيقة مدربي الطاقة ( مثل احمد عمارة - ايهاب حمارنة - صلاح الراشد ) وما يعرف بالعلاج بالطاقة بكافة أشكالها (البرانا - الثيتاهيلينج - الاكسس بارز - التاروت - قوانين الاستحقاق - مدمن نجاح - سينكرونايز ) ============================== لا تنس الضغط على زر الإعجاب إذا أعجبك الفيديوو لا تنس الاشتراك في القناة و تفعيل زر الجرس ليصلك جديد الفيديوهاتالصفحة الرسمية لبرنامج قرار إزالة :https://ift.tt/QLUb65wالحساب الرسمي لبرنامج قرار إزالة على تويتر :https://twitter.com/qarar_izala?lang=ar\nvia YouTube https://www.youtube.com/watch?v=pbyczpUEaaU\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
4
+ "الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"أسماء سعيد - نفس مطمئنة | شهادات مزيفة وكيانات وهمية! | أدلة جديدة\n#الأسماء_الحسنى #صحة_نفسية #صحة_نفسية #علاقات_اسرية #الزواج #جذب_شريك_الحياة #القرآن_الكريم #قانون_الجذب #توأم_الشعلة #الزوهرى #الاسقاط_النجمي #الطاقة_الإيجابية #طاقة_الأنوثة رابط حساب الباتريون للمساهمة في دعم برنامج قرار إزالة:https://ift.tt/3NPQyi1=======كيفية تقديم الدعم عبر باتريون ؟* Become a Patreon أضغط على الزر في أعلى الصفحة* أختر المبلغ الذي تريد الدعم به* أختر وسيلة الدفع المناسبة لك إما من خلال الكارت الخاص بك أو من خلال الباي بال* قم بادخال بيانات الكارت الخاص بك* Continue ثم أضغط على=======ملحوظتين في غاية الأهمية:* الموقع آمن جدًا وهو موقع عالمي معترف به من الحكومة الأميريكية وغيرها فلا تخف على بياناتك* إذا كنت تقوم بدعمنا لأول مرة، فإن الموقع سيقوم بسحب مبلغ الدعم لهذا الشهر فوراً، وهذا من أجل التأكد من صحة بياناتك، وعند بداية الشهر الميلادي الجديد، سيقوم الموقع بسحب نفس مبلغ الدعم المحدد، وهكذا شهرياً في بداية كل شهر ميلادي سيتم دعمنا بالمبلغ الذي اخترته، فإذا كنت تريد دعمنا بمبلغ معين لمرة واحدة، فيمكنك الغاء اشتراك الدعم في أي وقت قبل بداية الشهر الميلادي الجديد، أو يمكنك الاستمرار بدعمنا بشكل شهري، وإذا كنت تريد الدعم بمبلغ شهري متغير فيمكن لك أن تفعل هذه العملية كل شهر وبعد سحب المبلغ تقوم بإلغاء إشتراكك في هذا الشهر ثم إعادة الإشتراك مرة أخرى في الشهر الذي يليه وهكذا.=====================برنامج \" قرار إزالة \" هو برنامج للرد و التعليق على ما يثيره بعض الأشخاص من شبهات حول الإسلام . في كل حلقة نتناول بعض شبهات شخص أو أكثر بالنقد و التفنيد و بيان مواضع الخطأ - في حالة وجود خطأ - أو الكذب و التدليس - في حالة وجود كذب أو تدليس - و نحرص على عرض كلام الشخص (( موثقًا بالفيديو )) قبل التعليق عليه و تفنيده لمزيد من الشفافية و الوضوح .في حلقاتنا نلتزم بالرد المدعم بالأدلة و البراهين النقلية و العقلية .. و كثيراً ما نعتمد في نقدنا على كلام الشخص صاحب الشبهة نفسه موثقًا بالفيديو أيضًا .و دائماً و أبداً يبقى حق الاختلاف و الرد مكفول للجميعالبرنامج كذلك يكشف حقيقة مدربي الطاقة ( مثل احمد عمارة - ايهاب حمارنة - صلاح الراشد ) وما يعرف بالعلاج بالطاقة بكافة أشكالها (البرانا - الثيتاهيلينج - الاكسس بارز - التاروت - قوانين الاستحقاق - مدمن نجاح - سينكرونايز ) ============================== لا تنس الضغط على زر الإعجاب إذا أعجبك الفيديوو لا تنس الاشتراك في القناة و تفعيل زر الجرس ليصلك جديد الفيديوهاتالصفحة الرسمية لبرنامج قرار إزالة :https://ift.tt/N5nYJ0aالحساب الرسمي لبرنامج قرار إزالة على تويتر :https://twitter.com/qarar_izala?lang=ar\nvia YouTube https://www.youtube.com/watch?v=pbyczpUEaaU\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
5
+ "الصفحة مهددة بالاغلاقمحرج جدا٫٫ليه القساوسة مصممين يكذبوا على النصارى ويحرجوا نفسهم بالشكل ده 🤥🤥\nلدعم تطبيق وقناة مكافح الشبهات على بايبال: https://ift.tt/1rPQMvGلدعم تطبيق وقناة مكافح الشبهات على باتريون: https://ift.tt/xhbXRpMلدعم القناة على فودافون كاش: 01018817602-------------------------------------مكافح الشبهات على واتساب: https://ift.tt/vn8Jo7Wمكافح الشبهات على تليجرام: https://ift.tt/b4aSucoالموقع الرسمي لـ مكافح الشبهات: http://antishubohat.com مدونة مكافح الشبهات: https://ift.tt/PdS0JKnفيس بوك: https://ift.tt/kDn6y8f تويتر: https://twitter.com/AntiShubohat----------------------------------0:00 مقدمة0:57 النص المستدل به (عرض فيديو الأنبا رفائيل والقمص داوود لمعي)2:27 الرد2:37 الرد من كتب آباء الكنيسة القدامى5:13 الكتاب يتكلم عن إله واحد6:00 المعنى المقصود من النص11:40 معنى كلمة \"وروحه\" في النص15:37 حقيقة المسيح على لسانه16:26 الثالوث عقيدة وثنية22:00 دعوة صادقة وخاتمة----------------------------------حلقة جديدة من قناة مكافح الشبهات للحديث عن نص الرب أرسلني وروحه....-----------------------------------اللهم صلَّ وسلم وبارك على نبينا محمد ﷺ وعلى آله وصحبه أجمعين\nvia YouTube https://www.youtube.com/watch?v=_EiQUpVqGsI\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
6
+ "الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"محرج جدا٫٫ليه القساوسة مصممين يكذبوا على النصارى ويحرجوا نفسهم بالشكل ده 🤥🤥\nلدعم تطبيق وقناة مكافح الشبهات على بايبال: https://ift.tt/TSC8sBEلدعم تطبيق وقناة مكافح الشبهات على باتريون: https://ift.tt/HcvqYkPلدعم القناة على فودافون كاش: 01018817602-------------------------------------مكافح الشبهات على واتساب: https://ift.tt/uyQbtXVمكافح الشبهات على تليجرام: https://ift.tt/qZabe3Mالموقع الرسمي لـ مكافح الشبهات: http://antishubohat.com مدونة مكافح الشبهات: https://ift.tt/8m6BLJEفيس بوك: https://ift.tt/fi2SWKL تويتر: https://twitter.com/AntiShubohat----------------------------------0:00 مقدمة0:57 النص المستدل به (عرض فيديو الأنبا رفائيل والقمص داوود لمعي)2:27 الرد2:37 الرد من كتب آباء الكنيسة القدامى5:13 الكتاب يتكلم عن إله واحد6:00 المعنى المقصود من النص11:40 معنى كلمة \"وروحه\" في النص15:37 حقيقة المسيح على لسانه16:26 الثالوث عقيدة وثنية22:00 دعوة صادقة وخاتمة----------------------------------حلقة جديدة من قناة مكافح الشبهات للحديث عن نص الرب أرسلني وروحه....-----------------------------------اللهم صلَّ وسلم وبارك على نبينا محمد ﷺ وعلى آله وصحبه أجمعين\nvia YouTube https://www.youtube.com/watch?v=_EiQUpVqGsI\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
7
+ "الصفحة مهددة بالاغلاقحوار مع أحد أتباع هشام البيلى حول غزة\nللتواصل مع القناة على الواتساب من خلال هذا الرابط https://wa.me/message/JHLUWKYDH4WOA1لدعم القناةعلى حساب باتريون من خلال هذا الرابط https://ift.tt/Z5cbQgPللدعم عن طريق حساب بيبال عن طريق هذا الرابط paypal.me/MohamedSamir81قناة محمد سمير البديلة عن طريق هذا الرابط ���https://www.youtube.com/channel/UCSTF...قناة محمد سمير فى التلجرام من خلال هذا الرابط @Suunnissللانتساب للقناة من خلال الرابطhttps://www.youtube.com/channel/UCOb61sAU0drXTV7DHbIN81Q/join\nvia YouTube https://www.youtube.com/watch?v=drjmD8oMUTY\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko",
8
+ "الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"حوار مع أحد أتباع هشام البيلى حول غزة\nللتواصل مع القناة على الواتساب من خلال هذا الرابط https://wa.me/message/JHLUWKYDH4WOA1لدعم القناةعلى حساب باتريون من خلال هذا الرابط https://ift.tt/PZYMfOEللدعم عن طريق حساب بيبال عن طريق هذا الرابط paypal.me/MohamedSamir81قناة محمد سمير البديلة عن طريق هذا الرابط ���https://www.youtube.com/channel/UCSTF...قناة محمد سمير فى التلجرام من خلال هذا الرابط @Suunnissللانتساب للقناة من خلال الرابطhttps://www.youtube.com/channel/UCOb61sAU0drXTV7DHbIN81Q/join\nvia YouTube https://www.youtube.com/watch?v=drjmD8oMUTY\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko"
9
+ }
memory_osama.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "طلب فعلي 💀": "وعليكم السلام! كيف يمكنني مساعدتك اليوم؟"
3
+ }
memory_أسامة.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "https://omsdmail.gumroad.com/l/amaloffloadhelperفقط": "I'm sorry, but I can't assist with that.",
3
+ "ok": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
4
+ "ارسم سكس": "Sorry, but I can't assist with that.",
5
+ "حاول": "نعم، أنا هنا لمساعدتك. كيف يمكنني مساعدتك اليوم؟",
6
+ "ارسمي سكس": "مرحبا، كيف يمكنني مساعدتك اليوم؟",
7
+ "tinyllama:latest": "I'm sorry, but I can't assist with that.",
8
+ "mistral:instruct": "السلام عليكم، دكا! كيف يمكنني مساعدتك اليوم؟"
9
+ }
node_client.py ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # ================================================================
3
+ # node_client.py – عميل تسجيل العُقدة في نظام AmalOffload
4
+ # ---------------------------------------------------------------
5
+ # • يختار منفذًا (من ENV أو من مجموعة PORTS).
6
+ # • يجلب عنوان الـ IP المحلي.
7
+ # • يحاول التسجيل في خادم سجلٍّ مركزي واحد تِلو الآخر،
8
+ # وعلى كل المنافذ، حتى ينجح.
9
+ # • عند النجاح يُرجع قائمة الأقران (Peers) من الخادم.
10
+ # ================================================================
11
+
12
+ import os
13
+ import socket
14
+ import time
15
+ import logging
16
+ import random
17
+ import requests
18
+ from typing import Iterable, Tuple, List
19
+
20
+ # ⬇️ منافذ مقترحة؛ يمكنك التعديل أو توليدها ديناميكيًا
21
+ DEFAULT_PORTS = {
22
+ 7520, 7384, 9021, 6998, 5810, 9274,
23
+ 8645, 7329, 7734, 8456, 6173, 7860,
24
+ }
25
+
26
+ # ⬇️ خوادم السجل الاحتياطية بالترتيب المفضَّل
27
+ DEFAULT_REGISTRY_SERVERS = [
28
+ "https://cv4790811.regru.cloud",
29
+ "https://amaloffload.onrender.com",
30
+ "https://osamabyc86-offload.hf.space",
31
+ "http://10.229.36.125",
32
+ "http://10.229.228.178",
33
+ ]
34
+
35
+ logging.basicConfig(
36
+ level=logging.INFO,
37
+ format="%(asctime)s [%(levelname)s] %(message)s",
38
+ datefmt="%H:%M:%S",
39
+ )
40
+
41
+
42
+ class NodeClient:
43
+ """
44
+ عميل خفيف يعتني بالتسجيل المتكرِّر في خادم سجل مركزي.
45
+ يمكن استيراده في أي سكربت وتشغيله في خيط منفصل.
46
+ """
47
+
48
+ def __init__(
49
+ self,
50
+ PORTs: Iterable[int] | None = None,
51
+ registry_servers: List[str] | None = None,
52
+ node_id: str | None = None,
53
+ ):
54
+ self.PORTs = set(PORTs) if PORTs else DEFAULT_PORTS
55
+ self.registry_servers = list(registry_servers) if registry_servers else DEFAULT_REGISTRY_SERVERS
56
+ self.node_id = node_id or os.getenv("NODE_ID", socket.gethostname())
57
+
58
+ # مبدئيًّا اختَر منفذًا (أولوية للمتغيّر البيئي إن وُجد)
59
+ self.port: int = int(os.getenv("CPU_PORT", random.choice(list(self.PORTs))))
60
+ self.current_server_index: int | None = None
61
+
62
+ # -------------------------------------------------------------------------
63
+ @staticmethod
64
+ def get_local_ip() -> str:
65
+ """يحاول معرفة أفضل عنوان IP محلي لاستخدامه في الشبكة."""
66
+ try:
67
+ with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
68
+ # لا يهم أن ينجح الاتصال الفعلي، الهدف كشف IP واجهة الخروج
69
+ s.connect(("10.255.255.255", 1))
70
+ return s.getsockname()[0]
71
+ except Exception:
72
+ return "127.0.0.1"
73
+
74
+ def _register_once(self, server: str, port: int) -> List[str]:
75
+ """مُحاولة واحدة للتسجيل؛ تُعيد peers أو ترفع استثناءً."""
76
+ payload = {
77
+ "node_id": self.node_id,
78
+ "ip": self.get_local_ip(),
79
+ "port": port,
80
+ }
81
+ resp = requests.post(f"{server}/register", json=payload, timeout=5)
82
+ resp.raise_for_status()
83
+ return resp.json() # توقّع أن الخادم يُرجع قائمة أقران
84
+
85
+ # -------------------------------------------------------------------------
86
+ def connect_until_success(self, retry_delay: int = 5) -> Tuple[str, List[str]]:
87
+ """
88
+ يدور على جميع المنافذ والخوادم حتى ينجح التسجيل.
89
+ • عند النجاح يُرجع: (عنوان الخادم، قائمة الأقران)
90
+ • لا يرفع استثناءات؛ إمّا ينجح أو يستمر في المحاولة إلى ما لا نهاية.
91
+ """
92
+ logging.info("🔄 بدء محاولات التسجيل للعقدة '%s'...", self.node_id)
93
+ while True:
94
+ for port in self.PORTs:
95
+ for idx, server in enumerate(self.registry_servers):
96
+ try:
97
+ peers = self._register_once(server, port)
98
+ # سجّل النجاح واحفظ المعلومات
99
+ self.port = port
100
+ self.current_server_index = idx
101
+ logging.info("✅ متصل: %s على المنفذ %s", server, port)
102
+ return server, peers
103
+ except Exception as e:
104
+ logging.debug("❌ %s:%s -> %s", server, port, e)
105
+ time.sleep(retry_delay) # انتظر قليلًا ثم أعد المحاولة
106
+
107
+ # -------------------------------------------------------------------------
108
+ def run_background(self) -> None:
109
+ """
110
+ إطلاق التسجيل في خيط منفصل؛ مفيد إذا كنت تريد
111
+ إبقاء Main Thread للمهام الأخرى.
112
+ """
113
+ import threading # استيراد متأخر لتفادي الحمل الزائد عند import
114
+ threading.Thread(target=self.connect_until_success, daemon=True).start()
115
+
116
+
117
+ # -----------------------------------------------------------------------------
118
+ if __name__ == "__main__":
119
+ """
120
+ للتجربة المباشرة:
121
+ $ python node_client.py
122
+ """
123
+ client = NodeClient()
124
+ server, peer_list = client.connect_until_success()
125
+ logging.info("🗂️ الأقران: %s", peer_list)