103 |
104 | *
مسح رسالتك (يجب عمل ربلي على الرسالة المرا مسحها)
105 |
106 | مسح
107 |
108 |
109 |
110 | ## البوت
111 |
112 | [@Z11Bot](https://t.me/Z11Bot)
113 |
114 | ## الرخصة
115 | [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html)
116 |
117 | ## سياسة_الخصوصية
118 | [تجد نص سياسة الخصوصية هنا](https://github.com/Awiteb/randomChat/blob/master/privacy_policy.txt)
119 |
120 | ## الشروط_والاحكام
121 | [تجد نص الشروط والاحكام هنا](https://github.com/Awiteb/randomChat/blob/master/terms_and_conditions.txt)
122 |
--------------------------------------------------------------------------------
/config.py:
--------------------------------------------------------------------------------
1 | """
2 | عبر هذا الملف يتم ملئ المعلومات الاساسية
3 | https://t.me/BotFather يمكنك جلب التوكن الخاص بالبوت عبر هذا البوت
4 | """
5 |
6 | VERSION = "v2.2.1"
7 |
8 | # ضع توكن البوت هنا
9 | TOKEN = str("")
10 |
11 | # وضع الفرق بين كل رسالة ورسالة اخرى
12 | delay = 1 # 1s
13 |
14 | # اختيار عدد البلاغات الازمة لحظر العضو
15 | max_reports = 20 # 20
16 |
17 | # اختار اقصى مدة للجلسة
18 | session_time = 60*20 # 20m
19 |
20 | # لسهولة استعمال المتغيرات بين الملفات
21 | import telebot
22 | bot = telebot.TeleBot(TOKEN)
23 | botName = bot.get_me().first_name
--------------------------------------------------------------------------------
/db/__init__.py:
--------------------------------------------------------------------------------
1 | from .make import make
2 | from .insert import insert
3 | from .column import column
4 | from .row import row
5 | from .del_row import del_row
6 | from .count import count
7 | from .update import update
--------------------------------------------------------------------------------
/db/column.py:
--------------------------------------------------------------------------------
1 | from .db_config import (cursor, lock)
2 |
3 | def column(table_name:str, column:str):
4 | """ ترجع لك جميع القيم التي في العامود المعطى
5 | المتغيرات:
6 | table_name (str): اسم الجدول اذي يوجد فيه العامود
7 | column (str): اسم العامود الذي تريد اسخراج جميع القيم التي به
8 | المخرجات:
9 | list: قائمة من عناصر العامود
10 | """
11 | try:
12 | lock.acquire(True)
13 | cursor.execute(f"SELECT {column} FROM {table_name}")
14 | return list(map(
15 | lambda val: str(val).replace('
', '\n'),
16 | [val for table in cursor.fetchall() for val in table]
17 | ))
18 | finally:
19 | lock.release()
--------------------------------------------------------------------------------
/db/count.py:
--------------------------------------------------------------------------------
1 | from .db_config import (cursor, lock)
2 |
3 | def count(table_name:str, column:str, word:str):
4 | """ يجلب لك مرات تكرار ال القيمة في ال العمود
5 | المتغيرات:
6 | table_name (str): اسم الجدول الذي يوجد به العمود.
7 | column (str): العمود الذي يوجد فيه القيمة التي تريد معرفة عدد تكرارها.
8 | word (str): القيمة التي تريد معرفة عدد تكرارها.
9 | المخرجات:
10 | int: عدد تكرار القيمة في العمود.
11 | """
12 | try:
13 | lock.acquire(True)
14 | cursor.execute(f"SELECT COUNT() FROM {table_name} WHERE {column}='{word}'")
15 | return cursor.fetchone()[0]
16 | finally:
17 | lock.release()
--------------------------------------------------------------------------------
/db/db_config.py:
--------------------------------------------------------------------------------
1 | import sqlite3
2 | import threading
3 |
4 | coon = sqlite3.connect('db.sqlite3', check_same_thread=False)
5 | cursor = coon.cursor()
6 | lock = threading.Lock()
7 |
8 | # يتم وضع اسماء الجداول مع الاعمدة الخاصة بها في هذا القاموس
9 | tablesName = {
10 | 'users':['id', 'username', "last_msg", "reports", "users_reports"],
11 | 'message': ['msg', 'val'],
12 | 'waiting': ['id'],
13 | "chat_sessions": ["sessions", 'user_id', 'end_time'],
14 | "sessions_messages":["session", "user_id", "msg_id", "msg_id_in_partner"],
15 | }
--------------------------------------------------------------------------------
/db/del_row.py:
--------------------------------------------------------------------------------
1 | from .db_config import (coon, cursor,
2 | lock)
3 |
4 | def del_row(table_name:str, column:str, value:str):
5 | """ حذف صف من قاعدة البيانات
6 | المتغيرات:
7 | table_name (str): اسم الجدول الذي يوجد به العامود
8 | column (str): اسم العامود الذي يوجد به الصف
9 | value (str): القيمة التي تريد مسحها الموجودة في العامود
10 | """
11 | value = value.replace('\n', '
')
12 | try:
13 | lock.acquire(True)
14 | cursor.execute(f"DELETE FROM {table_name} WHERE {column}='{value}'")
15 | coon.commit()
16 | finally:
17 | lock.release()
--------------------------------------------------------------------------------
/db/insert.py:
--------------------------------------------------------------------------------
1 | from .db_config import (cursor, coon,
2 | tablesName, lock)
3 |
4 | def insert(table_name:str, args:tuple):
5 | """ ادخال البيانات داخل قاعدة البيانات
6 | المتغيرات:
7 | table_name (str): اسم الجدول المراد ادخال البيانات فيه
8 | args_ (tuple): القيم التي سوف تملي بها الاعمدة الخاصة بالجدول
9 | """
10 | try:
11 | lock.acquire(True)
12 | args = tuple(map(
13 | lambda ar:str(ar).replace('\n', '
'),
14 | args
15 | ))
16 | first_element = f"('{args[0]}')"
17 | cursor.execute(f"INSERT INTO {table_name} ({','.join(tablesName[table_name])}) VALUES {tuple(args) if len(args) > 1 else first_element}")
18 | coon.commit()
19 | finally:
20 | lock.release()
--------------------------------------------------------------------------------
/db/make.py:
--------------------------------------------------------------------------------
1 | from config import TOKEN
2 | from .db_config import (cursor, coon,
3 | tablesName)
4 |
5 | def make():
6 | """
7 | دالة انشاء قاعدة البيانات
8 | """
9 | # التحقق من انه تم وضع التوكن الخاص بالبوت ام لا
10 | if TOKEN == "":
11 | raise Exception("config يجب عليك وضع التوكن الخاص بالبوت في ملف")
12 | else:
13 | # يتم انشاء قاعدة البيانات عبر اللوب التالية
14 | for table in tablesName:
15 | cursor.execute(f"""CREATE TABLE IF NOT EXISTS '{table}'(
16 | {','.join(tablesName.get(table))}
17 | )""")
18 | coon.commit()
--------------------------------------------------------------------------------
/db/row.py:
--------------------------------------------------------------------------------
1 | from .db_config import (cursor, lock)
2 |
3 | def row(table_name:str, column:str, word:str, want='*', lst=True):
4 | """ جلب صف من قاعدة البيانات
5 |
6 | المتغيرات:
7 | table_name (str): اسم الجدول الذي يوجد به العمود
8 | column (str): اسم العمود اذي يوجد به الصف
9 | word (str): القيمة الموجود في العمود
10 | want (str, optional): word العمود الذي تريده من الصف الذي يوجد به العمود الي قيمته. Defaults to '*'.
11 | lst (bool, optional): اخراج المعطيات كلستة ام تيبل. Defaults to 'True'.
12 |
13 | المخرجات:
14 | [list,tuple,str,None]: قائمة بالنتائج او عنصر او لاشي اذ لم تكن هناك نتائج
15 | """
16 | try:
17 | lock.acquire(True)
18 | cursor.execute(f"SELECT {want} FROM {table_name} WHERE {column}='{word}'")
19 | if lst:
20 | result = list(map(
21 | lambda val: str(val).replace('
', '\n'),
22 | [val for t in cursor.fetchall() for val in t]
23 | ))
24 | else:
25 | result = list(map(
26 | lambda t: tuple(str(val) for val in t),
27 | [t for t in cursor.fetchall()]
28 | ))
29 | if lst:
30 | if (len(result) == 0):
31 | return None
32 | elif (len(result) == 1):
33 | return result[0] if lst else result[0][0]
34 | else:
35 | pass # سوف يتم تنفيد اخخر سطر وارجاع النتائج كلها
36 | else:
37 | pass # سوف يتم تنفيد اخخر سطر وارجاع النتائج كلها
38 | return result
39 | finally:
40 | lock.release()
--------------------------------------------------------------------------------
/db/update.py:
--------------------------------------------------------------------------------
1 | from .db_config import (coon, cursor, lock)
2 |
3 | def update(table_name:str, column:str, new_value:str, where_column:str, where_value:str) -> None:
4 | new_value = str(new_value).replace('\n', '
')
5 | """update column in database
6 | المتغيرات:
7 | table_name (str): اسم الجدول.
8 | column (str): العمود الذي تريد تحديثه.
9 | new_value (str): القيمة الجديدة.
10 | where_column (str): where_value العمود الذي يوجد به.
11 | where_value (str): where_column القيمة الموجودة في.
12 | """
13 | where_value = where_value.replace('\n', '
')
14 | new_value = new_value.replace('\n', '
')
15 | try:
16 | lock.acquire(True)
17 | cursor.execute(f"UPDATE {table_name} SET '{column}'= '{new_value}' WHERE {where_column} = '{where_value}'")
18 | coon.commit()
19 | finally:
20 | lock.release()
21 |
--------------------------------------------------------------------------------
/img/randomChatBBOT_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TheAwiteb/randomChat/43c62d002547dc0966adc9cb260a3f05c0199a0e/img/randomChatBBOT_image.jpg
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | """
2 | سوف يتم كتابة السورس كود الخاص بالبوت هنا
3 | """
4 | import time
5 | from telebot import util
6 | import db
7 | import markup
8 | import user
9 | import sender
10 | from config import (bot, botName, delay)
11 |
12 |
13 | # يلتقط الاوامر
14 | @bot.message_handler(commands=["start", "help", "search",
15 | "new_name", "my_name", "kill",
16 | "cancel","terms_and_conditions",
17 | "privacy_policy","report"])
18 | def command_handler(message):
19 | chat_id = str(message.chat.id)
20 | chat_is_private = message.chat.type == "private"
21 | text = message.text
22 | partner_id = user.partner(chat_id)
23 | in_session = user.in_sessions(chat_id)
24 | username = user.username(chat_id)
25 | # التحقق هل المحادثة خاصة، ام في محادثة عامة
26 | if chat_is_private:
27 | if user.check_reports(message, chat_id):
28 | # اذا كان النص من هذول الاثنين
29 | if text.startswith(("/start", "/help", "/terms_and_conditions",
30 | "/privacy_policy")):
31 | # ازالة علامة الكوماند
32 | command = text[1:]
33 | if command in ["terms_and_conditions", "privacy_policy"]:
34 | with open(command+'.txt', 'r', encoding="utf-8") as f:
35 | for text in util.split_string(f.read(), 3000):
36 | bot.reply_to(message, text)
37 | else:
38 | # جلب الرسالة من قاعدة البيانات بعد ازالة ال / للبحث عنه
39 | msg = db.row("message", "msg", command, "val")
40 | # ارسال الرسالة الى المستخدم
41 | bot.reply_to(message, msg)
42 | elif text.startswith("/search"):
43 | # اذا كان المستخدم موجود في قاعدة البيانات
44 | if user.found(chat_id):
45 | if not in_session:
46 | if not user.waiting(chat_id):
47 | if len(db.column('waiting', 'id')) != 0:
48 | user.make_session(chat_id)
49 | else:
50 | user.add_to_waiting(chat_id)
51 | msg = "[رسالة من البوت 🤖]\n\nلقد تم اضافتك الى قائمة الانتظار، عندما يتم ايجاد شخص سوف يتم ارسال رسالة لك\nللالغاء ارسل /cancel"
52 | bot.reply_to(message, msg)
53 | else:
54 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nانت في قائمة الانتظار حقا\nللالغاء ارسل /cancel")
55 | else:
56 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nانت في جلسة حقا")
57 | else:
58 | # جلب الرسالة من قاعدة البيانات
59 | msg = db.row("message", "msg", "no_user", "val")
60 | # ارسال الرسالة الى المستخدم
61 | bot.reply_to(message, msg, reply_markup=markup.make_username())
62 | elif text.startswith("/new_name"):
63 | user.add_user(chat_id, not chat_id in db.column('users', 'id'))
64 | elif text.startswith("/my_name"):
65 | if username:
66 | msg = "[رسالة من البوت 🤖]\n\nاسمك الحالي هو: %s\n\nتنويه:\nهذا الاسم سوف يتم عرضه لاي شخص تحادثه عبر البوت" % username
67 | else:
68 | msg = "[رسالة من البوت 🤖]\n\nلم يتم انشاء اسم لك بعد.\nلانشاء اسم ارسل /new_name"
69 | bot.reply_to(message, msg)
70 | elif text.startswith("/cancel"):
71 | if user.waiting(chat_id):
72 | user.del_waiting(chat_id)
73 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nلقد تم الغاء البحث عن جلسة بنجاح")
74 | else:
75 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nانت لست بجلسة للبحث عن جلسة ارسل /search")
76 | elif text.startswith("/kill"):
77 | if in_session:
78 | sessions_id = db.row('chat_sessions', 'user_id', chat_id, 'sessions')
79 | user.delete_sessions(sessions_id, chat_id)
80 | msg = "[رسالة من البوت 🤖]\n\nلقد تم قطع الجلسة بنجاح\nللبحث عن جلسة اخرى /search"
81 | bot.reply_to(message, msg)
82 | else:
83 | msg = "[رسالة من البوت 🤖]\n\nانت لست في جلسة حقا"
84 | bot.reply_to(message, msg)
85 | elif text.startswith("/report"):
86 | if in_session:
87 | user.make_report(message, chat_id, username, partner_id)
88 | else:
89 | bot.reply_to(message, "انت لست في جلسة\nيمكنك الابلاغ على شريكك في الجلسة عندما تكون في جلسة")
90 | else:
91 | pass
92 | # اذ كان محظور سوف يتم ارسال له رسالة من داخل الدالة
93 | else:
94 | pass
95 | else:
96 | # جلب الرسالة من قاعدة البيانات
97 | msg = db.row("message", "msg", "not_private", "val")
98 | # ارسال الرسالة الى المستخدم
99 | bot.reply_to(message, msg)
100 |
101 | # يلتقط جميع الرسايل ماعدا الاوامر
102 | @bot.message_handler(func=lambda msg: True, content_types= ["text", "audio", "document", "photo", "sticker",
103 | "video", "video_note", "voice", "animation"])
104 | def message_handler(message):
105 | chat_id = str(message.chat.id)
106 | # التحقق من ان الشخص ليس محظور
107 | if user.check_reports(message, chat_id):
108 | # اذا كان هناك جلسة
109 | if user.in_sessions(chat_id):
110 | partner_id = user.partner(chat_id)
111 | time_now = time.time()
112 | # التحقق ان وقت الجلسة لم ينتهي
113 | if time_now < float(user.sessions_time(chat_id)):
114 | reply_msg_id = str(message.reply_to_message.id) if message.reply_to_message else None
115 | if message.text == "مسح":
116 | sender.delete(message, reply_msg_id, partner_id)
117 | else:
118 | user_last_msg_time = float(db.row('users', "id", chat_id, "last_msg"))
119 | # التحقق من وقت اخر رسالة
120 | if time_now >= (user_last_msg_time+delay):
121 | # تحديث وقت اخر رسالة
122 | db.update("users", "last_msg", time_now, "id", chat_id)
123 | # اذا تم الرد على رسالة
124 | if reply_msg_id:
125 | sender.reply_message(message, chat_id, reply_msg_id)
126 | # اذا لم يتم الرد على رسالة
127 | else:
128 | sender.send_to_partner(message, chat_id)
129 | else:
130 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nلم يتم ارسال الرسالة بنجاح، بسبب عدم التزام بالوقت الذي بين كل رسالة واخرى وهو %s ثانية" % delay)
131 | else:
132 | # ايقاف الجلسة اذ انتها وقتها
133 | sessions_id = user.get_sessions(chat_id)
134 | user.kill_session(sessions_id)
135 | msg = "[رسالة من البوت 🤖]\n\nلقد انتهى وقت الجلسة، للبحث عن جلسة اخرى /search"
136 | for u_id in [chat_id, partner_id]:
137 | bot.send_message(u_id, msg)
138 | # اذ لم يكن في جلسة، سوف يتم تجاهل الرسالة
139 | else:
140 | pass
141 | # اذ كان محظور سوف يتم ارسال له رسالة من داخل الدالة
142 | else:
143 | pass
144 |
145 | @bot.edited_message_handler(func=lambda msg:True, content_types= ["text", "document", "photo",
146 | "video", "voice", "animation"])
147 | def edit_message_handler(message):
148 | chat_id = str(message.chat.id)
149 | msg_id = str(message.id)
150 | if user.found(chat_id):
151 | if user.in_sessions(chat_id):
152 | sender.edit_message(msg_id, chat_id, message)
153 | else:
154 | pass
155 | else:
156 | pass
157 |
158 | @bot.callback_query_handler(func=lambda call:True)
159 | def query_handler(call):
160 | callback = call.data
161 | user_id = str(call.from_user.id)
162 | # اذا كن الزر المضغوط هو زر اختيار الاسم
163 | if callback == "username":
164 | # اذا كان اليوزر ليس موجود في قاعدة البيانات
165 | if not user.found(user_id):
166 | user.add_user(user_id, new_user=True)
167 | bot.delete_message(user_id, call.message.id)
168 | else:
169 | # اخباره بأمر تحديث الاسم لان الزر فق للمستخدم الجديد
170 | bot.send_message(user_id, "[رسالة من البوت 🤖]\n\nلتحديث الاسم المستعار ارسل /new_name")
171 | else:
172 | bot.answer_callback_query(call.id, "المرسل %s" % callback)
173 |
174 | # تشغيل البوت
175 | while True:
176 | print(f"Start {botName}")
177 | try:
178 | bot.polling(none_stop=True, interval=0, timeout=0)
179 | except Exception as e:
180 | print(e)
181 | time.sleep(10)
--------------------------------------------------------------------------------
/make_db.py:
--------------------------------------------------------------------------------
1 | """
2 | انشاء قاعدة بيانات
3 | """
4 | from db import make, insert
5 |
6 | if __name__ == '__main__':
7 | make()
8 | insert(table_name='message', args=("start", "اهلا مع هذا البوت تستطيع المحادثة بسرية تامة مع شخص عشوائي ومجهول الهوية\nلمعرفة طريقة استخدام البوت: /help\nيمكنك الاطلاع على السورس كود من هنا https://github.com/Awiteb/randomChat\n\nعند ادخال اسم مستعار واستخدم البوت فأنت توافق على سياسة الخصوصية والشروط والاحكام\nالشروط والاحكام: /terms_and_conditions\nسياسة الخصوصية: /privacy_policy"))
9 | insert(table_name='message', args=("help", "اهلا طريقة استخدام البوت بسيطة جدا\nيمكنك بدا جلسة عبر هذا الامر /search\nويمكنك تغير الاسم المستعار الخاص بك عبر هذا الامر /new_name\nويمكنك قطع الجلسة التي بينك وبين العضو الاخر عبر هذا الامر /kill\nلمعرفة اسمك المستعار /my_name\nوللتبليغ على عضو ارسل هذا الامر بالجلسة: /report\nلمسح رسالة في الجلسة سوي ربلي على الرسالة المراد مسحها بـ'مسح'"))
10 | insert(table_name='message', args=("no_user", "اهلا بك، قبل البدء في دخول الجلسات يجب عليك اختيار اسم مستعار لك \n \n تنويه: \n سوف يتم عرض الاسم المستعار للشخص المشارك معك بالجلسة"))
11 | insert(table_name='message', args=("not_private", "عذرا لحفظ خصوصية المستخدمين لايمكن انشاء جلسة في محادثة عامة"))
--------------------------------------------------------------------------------
/markup/__init__.py:
--------------------------------------------------------------------------------
1 | from .make_username import make_username
2 | from .username import username
3 |
--------------------------------------------------------------------------------
/markup/make_username.py:
--------------------------------------------------------------------------------
1 | from .markup_config import MARKUP, BUTTON
2 |
3 | def make_username():
4 | markup = MARKUP()
5 | markup.add(
6 | BUTTON(text="اضغط هنا لادخال الاسم", callback_data="username")
7 | )
8 | return markup
--------------------------------------------------------------------------------
/markup/markup_config.py:
--------------------------------------------------------------------------------
1 | from telebot import types
2 |
3 | MARKUP = types.InlineKeyboardMarkup
4 | BUTTON = types.InlineKeyboardButton
--------------------------------------------------------------------------------
/markup/username.py:
--------------------------------------------------------------------------------
1 | import user
2 | from .markup_config import MARKUP, BUTTON
3 |
4 | def username(user_id:str):
5 | """ عمل زر باسم الشخص
6 |
7 | المتغيرات:
8 | user_id (str): ايدي الشخص
9 |
10 | المخرجات:
11 | [telebot.types.InlineKeyboardMarkup]: الزر
12 | """
13 | markup = MARKUP()
14 | username = user.username(user_id)
15 | markup.add(BUTTON(text=username, callback_data=username)) # لايوجد قيمة مرجعة
16 | return markup
--------------------------------------------------------------------------------
/privacy_policy.txt:
--------------------------------------------------------------------------------
1 | سياسة الخصوصية.
2 |
3 | يقدم بوت المحادثات العشوائية ( سياسة الخصوصية) من أجل تعريفك بالإجراءات والممارسات المتبعة لدينا، بهدف حماية جميع حقوق مستخدمينه من خلال الحفاظ على سرية المعلومات الشخصية والخاصة بالمستخدمين وتزويدهم بأعلى معايير الحماية، وقد أعددنا هذه السياسة للإفصاح عن النهج الذي نتبعه في جمع المعلومات، لذا يرجى قراءة ومراجعة هذه السياسة بعناية قبل استخدام هذه البوت ويعد استخدامك للبوت موافقة صريحة منك غير مشروطة ولا رجعة فيها.
4 |
5 | التعريفات والتفسيرات
6 |
7 | يشير مصطلح "البوت": إلى البوت المرتبط بهذا السورس (https://github.com/Awiteb/randomChat).
8 |
9 | البيانات المستخدمة
10 |
11 | ماهي البيانات التي يتم جمعها؟
12 |
13 | عند استخدامك للبوت نقوم بتخزين الايدي الخاص بك في التلقرام والاسم المستعار الذي اخترته ووقت اخر رسالة ارسلتها وعدد البلاغات التي لديك، وتخزين جميع ايدي الرسايل الي ترسلها في الجلسة اثناء الجلسة (بعد الجلسة يتم مسحها). وعند قيامك بإستخدام البوت واختيار اسم مستعار فأنت توافق ضمنياً على سياسة الخصوصية.
14 |
15 | كيف يتم جمعها
16 |
17 | هذه المعلومات أو البيانات تساعدنا في انشاء اتصال بينك وبين شريكك في الجلسة وتنفيذ طلباتك وتقديم كافة الخدمات التي تحقق الغرض من إنشاء هذه البوت:
18 |
19 | عند استخدام البوت:
20 |
21 | عند استخدامك للبوت يمكننا أن نجمع ايديات الرسائل المرسلة لغرض انشاء اتصال بينك وبين شريكك في الجلسة ووقت اخر رسالة تم ارسالها من طرفك والايدي الخاص بك في تلقرام وعدد البلاغات التي عليك.
22 |
23 |
24 | كيف يتم استخدامها؟ (آلية الاستخدام):
25 |
26 | يتم استخدام البيانات المقدمة لنا لأغراض محددة في السياسة، تتمثل في تمكين استخدامك للخدمات المتاحة على البوت، وذلك تحقيقاً للأهداف المرجوة، انشاء حلسة مرسالة بينك وبين عضو عشوائي / مسح الرسائل بعد كل جلسة / تعديل الرسائل عندمها تقوم بتعديلها / ومسح الرسائل عندما تستخدم امر المسح ("مسح")
27 |
28 | أ. كيف تتم حمايتها:
29 |
30 | (السرية والأمان) سنحافظ في كافة الأوقات على خصوصية وسرية كافة البيانات التي نتحصل عليها. ولن يتم إفشاء هذه المعلومات ابدا لاي منظمة او جهة حكومية لاي سبب كان
31 |
32 | المراسلة:
33 | تتم المراسلة عبر البوت بسرية تامة حيث انه الرسائل والتعديل والمسح يكون بينك وبين شريكك في الجلسة فقط ولايتم استخدام اي وسيلة تخزين ولا اي وسيط بينك وبين شريكك للاستقبال او الارسال في الجلسة
34 |
35 | التغييرات التي قد تتم على هذه الشروط:
36 |
37 | يرجى منك الأخذ بعين الاعتبار أننا نقوم بمراجعة سياسة الخصوصية هذه دورياً، وقد نجري بعض التغييرات عليها لذلك يجب عليك الحرص على زيارة هذه الصفحة بشكل دوري للتأكد من معرفتك بأحدث نسخة من سياسة الخصوصية.
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | certifi==2021.5.30
2 | chardet==4.0.0
3 | idna==2.10
4 | pyTelegramBotAPI==3.8.1
5 | pytz==2021.1
6 | requests==2.25.1
7 | urllib3==1.26.6
8 |
--------------------------------------------------------------------------------
/sender/__init__.py:
--------------------------------------------------------------------------------
1 | from .send_to_partner import send_to_partner
2 | from .edit_message import edit_message
3 | from .reply_message import reply_message
4 | from .delete import delete
--------------------------------------------------------------------------------
/sender/delete.py:
--------------------------------------------------------------------------------
1 | import user, db
2 | from config import bot
3 | from telebot.types import Message
4 |
5 | def delete(message:Message, reply_msg_id:str, partner_id:str):
6 | """ مسح الرسالة من الجلسة
7 |
8 | Args:
9 | message (Message): رسالة امر المسح
10 | reply_msg_id (str): ايدي الرسالة المراد مسحها
11 | partner_id (str): ايدي الشريك في الجلسة
12 | """
13 | msg_id, chat_id = list(map(str, [message.id,message.chat.id])) # جعلهم نص
14 | if reply_msg_id:
15 | # اخذ ايدي الرسلة عند شريك الجلسة لحذفها
16 | partner_msg_id = user.partner_msg_id(chat_id, reply_msg_id)
17 | # اذا كانت الرسالة من المرسل، وفي الجلسة
18 | if bool(list(filter(lambda m_id: m_id == reply_msg_id,
19 | db.row("sessions_messages", "user_id", chat_id, "msg_id")))):
20 | for message_be_delete in [(partner_id, partner_msg_id),
21 | (chat_id, msg_id),
22 | (chat_id, reply_msg_id)]:
23 | try:
24 | c_id, m_id = message_be_delete
25 | bot.delete_message(c_id, m_id)
26 | except Exception:
27 | pass
28 | else:
29 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nالرسالة ليست موجودة في الجلسة او انها ليست لك")
30 | else:
31 | bot.reply_to(message, "[رسالة من البوت 🤖]\n\nيجب عمل ربلي على الرسالة التي تريد مسحها من عند الطرف الثاني")
32 |
--------------------------------------------------------------------------------
/sender/edit_message.py:
--------------------------------------------------------------------------------
1 | import markup
2 | from telebot import types
3 | from .get_reply import get_reply
4 | from config import bot
5 | import user
6 | import markup
7 |
8 | def edit_message(meg_id:str, chat_id:str, new_message:types.Message):
9 |
10 | partner_id = user.partner(chat_id)
11 | partner_msg_id = user.partner_msg_id(chat_id, meg_id)
12 | reply, replyType, text = get_reply(new_message)
13 | edit(replyType, reply, text,
14 | partner_id, partner_msg_id, markup.username(chat_id))
15 |
16 | def edit(replyType, reply, text,
17 | chat_id, msg_id, m):
18 |
19 | if replyType in ["text"]:
20 | if replyType == "voice":
21 | bot.edit_message_caption(text, chat_id, msg_id, reply_markup=m)
22 | else:
23 | bot.edit_message_text(reply, chat_id, msg_id,
24 | reply_markup=m)
25 | else:
26 | if replyType == "document":
27 | reply = types.InputMediaDocument(reply)
28 |
29 | elif replyType == "photo":
30 | reply = types.InputMediaPhoto(reply)
31 | elif replyType == "video":
32 | reply = types.InputMediaVideo(reply)
33 | elif replyType == "animation":
34 | reply = types.InputMediaAnimation(reply)
35 | elif replyType == "voice":
36 | reply = None
37 | else:
38 | return
39 | # انشاء التعديل بعد اخذ الميديا
40 | try:
41 | bot.edit_message_media(reply, chat_id, msg_id,reply_markup=m)
42 | except: # تحصل مشكلة عندما يتم تعديل شرح الملف بدون الملف
43 | pass # سوف يتم تجالها
44 | bot.edit_message_caption(text, chat_id, msg_id, reply_markup=m)
--------------------------------------------------------------------------------
/sender/get_reply.py:
--------------------------------------------------------------------------------
1 | from telebot.types import Message
2 |
3 | def get_reply(message:Message):
4 | """ ارجاع الايدي و نوع ونص الرسالة
5 |
6 | Args:
7 | message (telebot.types.Message): الرسالة المراد استخراج البيانات منها
8 |
9 | Returns:
10 | : ارجاع الايدي و نوع ونص الرسالة
11 | """
12 | replyType = message.content_type
13 | text = message.text if replyType == 'text' else message.caption
14 | if replyType == "text":
15 | reply = text
16 | elif replyType == "audio":
17 | reply = message.audio.file_id
18 | elif replyType == "document":
19 | reply = message.document.file_id
20 | elif replyType == "photo":
21 | reply = message.photo[0].file_id
22 | elif replyType == "sticker":
23 | reply = message.sticker.file_id
24 | elif replyType == "video":
25 | reply = message.video.file_id
26 | elif replyType == "video_note":
27 | reply = message.video_note.file_id
28 | elif replyType == "voice":
29 | reply = message.voice.file_id
30 | elif replyType == "animation":
31 | reply = message.animation.file_id
32 | else:
33 | return
34 | return reply, replyType, text
--------------------------------------------------------------------------------
/sender/reply_message.py:
--------------------------------------------------------------------------------
1 | from telebot.types import Message
2 | import db
3 | import user
4 | from .send_to_partner import send_to_partner
5 |
6 | def reply_message(message:Message, user_id:str, reply_to:str):
7 | """ عمل ربلي لرسالة
8 |
9 | Args:
10 | message (Message): الرسالة المراد ارسالها مع ربلي لرسالة اخرى
11 | user_id (str): ايدي مرسل الرسالة
12 | reply_to (str): ايدي الرسالة المراد عمل ربلي لها
13 | """
14 | session_id = user.get_sessions(user_id)
15 | # اذا كانت الرسالة في الجلسة
16 | if list(filter(lambda t: reply_to in t,
17 | db.row("sessions_messages", "session", session_id, "msg_id, msg_id_in_partner", lst=False))):
18 | # اخذ ايدي الشريك في الجلسة
19 | partner_id = user.partner(user_id)
20 | # اذا كانت الرسالة المعمول لها ربلي من المرسل
21 | if str(message.reply_to_message.from_user.id) == user_id:
22 | # اخذ ايدي الرسالة عند الشريك
23 | msg_id = [user.partner_msg_id(user_id, reply_to)]
24 | # اذ لم تكن الرسالة من المرسل
25 | else:
26 | msg_id = list(filter(
27 | lambda t: t[1] == reply_to,
28 | db.row("sessions_messages", "user_id", partner_id, "msg_id, msg_id_in_partner", lst=False)
29 | ))
30 | # اذا كانت الرسالة ليست في الجلسة
31 | else:
32 | # جعل قيمة الايدي لاشي لتجنب عمل ربلي
33 | msg_id = [None]
34 | msg_id = msg_id[0] if msg_id else None
35 | send_to_partner(message, user_id, msg_id)
--------------------------------------------------------------------------------
/sender/send_message.py:
--------------------------------------------------------------------------------
1 | from config import bot
2 |
3 | def send_message(chat_id, replyType, reply, text, markup=None, msg_id=None):
4 | """ ارسال رسالة الى مستخدم
5 |
6 | المتغيرات:
7 | chat_id (str): المستخدم المراد ارسال الرسالة له
8 | replyType (str): نوع الرسالة
9 | reply (str): النص، او ايدي الملف المراد ارساله
10 | text (str): نص الرسالة او ال شرح الملف
11 | markup (telebot.types.InlineKeyboardMarkup, optional): الازرار. Defaults to None.
12 | msg_id (str,int, optional): ايدي الرسالة لعمل ربلي لها. Defaults to None.
13 | المخرجات:
14 | [int]: ايدي الرسالة التي تم ارسالها
15 | """
16 |
17 | if replyType == "text":
18 | msg = bot.send_message(chat_id=chat_id, text=reply, reply_to_message_id=msg_id,
19 | reply_markup=markup, )
20 | elif replyType == "audio":
21 | msg = bot.send_audio(chat_id=chat_id, audio=reply, caption=text if text != 'None' else "",
22 | reply_to_message_id=msg_id, reply_markup=markup, )
23 | elif replyType == "document":
24 | msg = bot.send_document(chat_id=chat_id, data=reply, caption=text if text != 'None' else "",
25 | reply_to_message_id=msg_id, reply_markup=markup, )
26 | elif replyType == "photo":
27 | msg = bot.send_photo(chat_id=chat_id, photo=reply, caption=text if text != 'None' else "",
28 | reply_to_message_id=msg_id, reply_markup=markup, )
29 | elif replyType == "sticker":
30 | msg = bot.send_sticker(chat_id=chat_id, data=reply,
31 | reply_to_message_id=msg_id, reply_markup=markup)
32 | elif replyType == "video":
33 | msg = bot.send_video(chat_id=chat_id, data=reply, caption=text if text != 'None' else "",
34 | reply_to_message_id=msg_id, reply_markup=markup, )
35 | elif replyType == "video_note":
36 | msg = bot.send_video_note(chat_id=chat_id, data=reply,
37 | reply_to_message_id=msg_id, reply_markup=markup, )
38 | elif replyType == "voice":
39 | msg = bot.send_voice(chat_id=chat_id, voice=reply, caption=text if text != 'None' else "",
40 | reply_to_message_id=msg_id, reply_markup=markup, )
41 | elif replyType == "animation":
42 | msg = bot.send_animation(chat_id=chat_id, animation=reply, caption=text, reply_to_message_id=msg_id,
43 | reply_markup=markup)
44 | else:
45 | return
46 | return msg.id
--------------------------------------------------------------------------------
/sender/send_to_partner.py:
--------------------------------------------------------------------------------
1 | from telebot.types import Message
2 | from .get_reply import get_reply
3 | from .send_message import send_message
4 | import db
5 | import user
6 | import markup
7 |
8 | def send_to_partner(message:Message, chat_id:str, rep_msg_id=None):
9 | """" ارسال الرسالة الى رفيق الشخص
10 |
11 | المتغيرات:
12 | message (telebot.types.Message): الرسالة
13 | chat_id (str): الشخص الذي يريد ارسالها
14 | rep_msg_id (str, optional): ايدي الرسالة المراد الرد عليها. Defaults to None.
15 | """
16 | reply, replyType, text = get_reply(message)
17 | partner_id = user.partner(chat_id)
18 | session_id = user.get_sessions(chat_id)
19 | msg_id = message.id
20 | partner_msg_id = send_message(partner_id, replyType, reply, text,
21 | markup.username(chat_id), msg_id=rep_msg_id)
22 | db.insert("sessions_messages", [session_id, chat_id, msg_id, partner_msg_id])
--------------------------------------------------------------------------------
/terms_and_conditions.txt:
--------------------------------------------------------------------------------
1 | الشروط والأحكام
2 |
3 | التعريفات والتفسيرات
4 |
5 | يشير مصطلح "البوت": إلى البوت المرتبط بهذا السورس (https://github.com/Awiteb/randomChat).
6 | يشير مصطلح "المالك": اي من يقوم بتنصيب السورس على بوت واستخدامه
7 | يشير مصطلح "المستخدم": اي من يقوم باستعمال البوت
8 |
9 | خدمات البوت:
10 |
11 | البوت: يهدف البوت الى رفع نسبة السرية في تطبيق التلقرام لدى المهتمين في انشاء محادثات قصيرة لاي غرض كان
12 |
13 | المستخدم: يمكن للمستخدم الاستفادة من خدمات البوت المقدمة بعد اختياره اسم مستعار له.
14 |
15 | المسؤولية:
16 |
17 | المستخدم: إذا كنت قاصراً (في المملكة العربية السعودية، هذا يعني أنك أقل من 18 عامًا)، يجب أن يوافق والديك أو الوصي الشرعي على الشروط نيابة عنك.
18 |
19 | حدود تحمل المسؤولية:
20 |
21 | المالك غير مسؤول عن أي أضرار أو مشكلات ناتجة بسبب ما يتم تقديمه في البوت من قبل الاعضاء الذين يستخدمونه.
22 |
23 | سلوك المستخدم
24 |
25 | المستخدم: كشرط للاستخدام، فإنك تقر بـ: عدم استخدام الخدمات المقدمة بواسطة هذه البوت لأي غرض غير قانوني أو محظور بموجب هذه السياسة، أو لأي غرض آخر لا يقصده البوت. على سبيل المثال، وليس الحصر، أنت توافق على عدم استخدام الخدمات المقدمة من أجل:
26 |
27 | الإساءة أو المضايقة أو التهديد أو انتحال شخصية أو تخويف أي شخص.
28 | نشر أو نقل أو التسبب في نشر ونقل، أي محتوى تشهيري أو إباحي أو مسيء ينتهك أي حق نشر أو حق آخر لأي شخص.
29 | نشر أو إرسال أو التسبب في نشر أو إرسال أي اتصال مصمم أو يهدف إلى الحصول على كلمة مرور أو حساب أو معلومات خاصة من أي مستخدم.
--------------------------------------------------------------------------------
/user/__init__.py:
--------------------------------------------------------------------------------
1 | from .found import found
2 | from .add_user import add_user
3 | from .username import username
4 | from .add_to_waiting import add_to_waiting
5 | from .del_waiting import del_waiting
6 | from .waiting import waiting
7 | from .make_session import make_session
8 | from .in_sessions import in_sessions
9 | from .sessions_time import sessions_time
10 | from .get_sessions import get_sessions
11 | from .delete_sessions import delete_sessions
12 | from .kill_session import kill_session
13 | from .partner import partner
14 | from .partner_msg_id import partner_msg_id
15 | from .make_report import make_report
16 | from .check_reports import check_reports
--------------------------------------------------------------------------------
/user/add_to_waiting.py:
--------------------------------------------------------------------------------
1 | import db
2 | from .make_session import make_session
3 |
4 | def add_to_waiting(user_id:str):
5 | """ اضافة الشخص الى قائمة الانتظار
6 |
7 | المتغيرات:
8 | user_id (str): الايدي الخاص بالمستخدم
9 | """
10 | # اذا كانت قائمة الانتظار ليست فاضية انشئ جلسة
11 | if len(db.column('waiting', 'id')) > 0:
12 | make_session(user_id)
13 | else:
14 | # اضافة العضو الى قائمة الانتظار
15 | db.insert('waiting', (user_id,))
--------------------------------------------------------------------------------
/user/add_user.py:
--------------------------------------------------------------------------------
1 | from config import bot
2 | from .save_username import save_username
3 |
4 | def add_user(user_id:str, new_user:bool):
5 | """ الدخول الى دالة تغير الاسم
6 |
7 | المتغيرات:
8 | user_id (str): الايدي الخاص بالشخص
9 | new_user (bool): هل تود اضافته كمستخدم جديد ام تغير اسم المستخدم فقط
10 | """
11 | msg = bot.send_message(user_id, "للالغاء ارسل: /cancel\n ارسل الاسم المستعار الان")
12 | bot.register_next_step_handler(msg, save_username, user_id, new_user)
--------------------------------------------------------------------------------
/user/check_reports.py:
--------------------------------------------------------------------------------
1 | import db
2 | from config import bot, max_reports
3 |
4 | def check_reports(message, user_id):
5 |
6 | user_reports = db.row('users', "id", user_id, "reports")
7 | if user_reports:
8 | if int(user_reports) < max_reports:
9 | return True
10 | else:
11 | bot.reply_to(message, "لقد ,وصلت الي حد البلاغات وهو %s، عدد البلاغات التي لديك %s\n\nيحافظ حد البلاغات على استقرار البوت" % (max_reports, user_reports))
12 | return False
13 | else:
14 | return True
--------------------------------------------------------------------------------
/user/del_session_message.py:
--------------------------------------------------------------------------------
1 | from .get_session_messages import get_session_messages
2 | from .partner import partner
3 | from config import bot
4 |
5 | def del_session_message(session_id:str):
6 | """ مسح الرسائل التي رسل في الجلسة
7 |
8 | Args:
9 | session_id (str): ايدي الجلسة
10 | """
11 | for message in get_session_messages(session_id):
12 | user_id = message[0]
13 | msg_id = message[1]
14 | partner_msg_id = message[2]
15 | partner_id = partner(user_id)
16 | try:
17 | bot.delete_message(user_id, msg_id)
18 | bot.delete_message(partner_id, partner_msg_id)
19 | except Exception:
20 | pass # عدم فعل شي عند ظهور خطأ عدم وجود الرسالة
--------------------------------------------------------------------------------
/user/del_waiting.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def del_waiting(user_id:str):
4 | """ مسح الشخص من قائمة المنتظرين
5 |
6 | Args:
7 | user_id (str): الشخص المراد مسحه
8 | """
9 | db.del_row('waiting', 'id', user_id)
--------------------------------------------------------------------------------
/user/delete_sessions.py:
--------------------------------------------------------------------------------
1 | from config import bot
2 | from .username import username
3 | from .partner import partner
4 | from .kill_session import kill_session
5 |
6 | def delete_sessions(session_id:str, user_id:str):
7 | """ مسح جلسة
8 |
9 | المتغيرات:
10 | session_id (str): ايدي الجلسة
11 | user_id (str): ايدي من قام بقطع الجلسة
12 | """
13 | partenet_id = partner(user_id)
14 | killer_username = username(user_id)
15 | kill_session(session_id)
16 | bot.send_message(partenet_id, "لقد تم قطع الجلسة من قبل %s\n\nللبحث عن جلسة جديدة /search" % killer_username)
--------------------------------------------------------------------------------
/user/found.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def found(user_id:str):
4 | """ ارجاع اذا الايدي موجود في قاعدة البيانات ام لا
5 |
6 | المتغيرات:
7 | user_id (str): ايدي المستخدم
8 |
9 | المخرجات:
10 | bool: المستخدم موجود ام لا
11 | """
12 | # false اذا كانت اللستة فاضية سوف يرجع
13 | return bool(list(
14 | filter(
15 | lambda u_id:u_id == user_id,
16 | db.column("users", "id")
17 | )
18 | ))
19 |
--------------------------------------------------------------------------------
/user/get_session_messages.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def get_session_messages(session_id:str):
4 | """ حلب جيمع الرسائل التابعة للجلسة
5 |
6 | المتغيرات:
7 | session_id (str): ايدي الجلسة المراد استخخراج معلوماتها
8 |
9 | المخرجات:
10 | list: الرسالة من عند المرسل والمستقبل مع ايدي المرسل
11 | """
12 | return (db.row("sessions_messages", "session", session_id, 'user_id, msg_id, msg_id_in_partner', lst=False))
--------------------------------------------------------------------------------
/user/get_sessions.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def get_sessions(user_id:str):
4 | """ ارجاع ايدي الجلسة التي يوجد بها المستخدم
5 |
6 | المتغيرات:
7 | user_id (str): الخص الذي تريد كعرفة ايدي الجلسة الخاصة به
8 |
9 | المخرجات:
10 | [str,None]: ايدي الجلسة ولاشي اذ لم تكن موجودة
11 | """
12 | return db.row("chat_sessions", 'user_id', user_id, 'sessions')
--------------------------------------------------------------------------------
/user/in_sessions.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def in_sessions(user_id:str):
4 | """ التحقق هل الشخص موجود في جلسة ان لا
5 |
6 | المتغيرات:
7 | user_id (str): ايدي الشخص
8 |
9 | المحرجات:
10 | [bool]: موجود ام لا
11 | """
12 | # false اذا كانت اللستة فاضية سوف يرجع
13 | return bool(list(
14 | filter(
15 | lambda u_id: u_id == user_id,
16 | db.column('chat_sessions', 'user_id')
17 | )
18 | ))
--------------------------------------------------------------------------------
/user/kill_session.py:
--------------------------------------------------------------------------------
1 | import db
2 | from .del_session_message import del_session_message
3 |
4 | def kill_session(session_id:str):
5 | """ اغلاق الجلسة
6 |
7 | Args:
8 | session_id (str): ايدي الجلسة
9 | """
10 | del_session_message(session_id)
11 | db.del_row('sessions_messages', 'session', session_id)
12 | db.del_row('chat_sessions', 'sessions', session_id)
--------------------------------------------------------------------------------
/user/make_report.py:
--------------------------------------------------------------------------------
1 | import db
2 | from config import bot, max_reports
3 | from telebot.types import Message
4 |
5 | def make_report(message:Message, chat_id:str, username:str, partner_id:str):
6 | """ الابلاغ على شريك في الجلسة
7 |
8 | المتغيرات:
9 | message (Message): الرسالة التي محتواها رسالة الابلاغ
10 | chat_id (str): ايدي المبلغ
11 | username (str): اسم المبلغ
12 | partner_id (str): ايدي المبلغ عليه
13 | """
14 | users = db.row("users", "id", partner_id, "users_reports")
15 | user_reports = int(db.row('users', "id", partner_id, "reports"))
16 | bot.reply_to(message, "تم الابلاغ بنجاح")
17 | if chat_id in users.split():
18 | pass
19 | else:
20 | bot.send_message(partner_id, "تم الابلاغ عليك من قبل %s، عدد البلاغات الباقية حتى يتم حظرك %s" % (username, (max_reports) - (user_reports+1)))
21 | users += " %s" % chat_id
22 | db.update("users", "users_reports", users, "id", partner_id)
23 | db.update("users", "reports", user_reports+1, "id", partner_id)
--------------------------------------------------------------------------------
/user/make_session.py:
--------------------------------------------------------------------------------
1 | import db
2 | from config import bot, session_time
3 | from .username import username
4 | from .del_waiting import del_waiting
5 | from random import choice
6 | from time import time
7 | from pytz import UTC
8 | from datetime import datetime
9 |
10 | def make_session(user_id):
11 | """ انشاء جلسة بين اثنين
12 |
13 | المتغيرات:
14 | user_id (str): الايدي الخاص بالشخص المراد بحث جلسة له
15 | """
16 | # اذا تم العثور على منتظرين
17 | if len(db.column('waiting', 'id')) > 0:
18 | user_id2 = choice(db.column('waiting', 'id'))
19 | session_id = user_id+user_id2
20 | end_time = time()+session_time
21 | end_date = str(datetime.fromtimestamp(end_time, UTC).strftime("%I:%M %p %Z"))
22 | del_waiting(user_id2)
23 | for user in [user_id, user_id2]:
24 | db.insert('chat_sessions', (session_id, user, end_time))
25 | bot.send_message(user, "تم انشاء جلسة مع %s\nلقطع الجلسة ارسل /kill\n\nسوف يتم قطع الجلسة في \n%s\nمحادثة ممتعة 🌹" % (username(user_id if user_id != user else user_id2), end_date))
26 | # الغاء انشاء جلسة
27 | else:
28 | pass
--------------------------------------------------------------------------------
/user/partner.py:
--------------------------------------------------------------------------------
1 | import db
2 | from .get_sessions import get_sessions
3 | from .in_sessions import in_sessions
4 |
5 | def partner(user_id:str):
6 | """ جلب شريك الجلسة الخاصة ب المستخدم
7 |
8 | المتغيرات:
9 | user_id (str): ايدي المستخدم الذي تريد شريكه
10 |
11 | المخرجات:
12 | [str,None]: ايدي الشريك او لاشي
13 | """
14 | if in_sessions(user_id):
15 | session_id = get_sessions(user_id)
16 | partner_id = ''.join(list(filter(
17 | lambda u_id: u_id!=user_id,
18 | db.row('chat_sessions', 'sessions', session_id, 'user_id')
19 | )))
20 | return partner_id
21 | else:
22 | return None
--------------------------------------------------------------------------------
/user/partner_msg_id.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def partner_msg_id(chat_id:str, msg_id:str):
4 | """ جلب ايدي الرسالة المدخل ايديها عند شريكك في المحادثة
5 |
6 | المتغيرات:
7 | chat_id (str): ايدي المرسل
8 | msg_id (str): ايدي الرسالة المراد معرفة ايديها عند الشريك
9 |
10 | المخرجات:
11 | [str]: ايدي الرسالة
12 | """
13 | msg_id = list(filter(
14 | lambda t: t[0] == msg_id,
15 | db.row("sessions_messages", "user_id", chat_id, 'msg_id,msg_id_in_partner', lst=False)
16 | )) # اخذ العنصر الثاني من العنصر الاول
17 | return msg_id[0][1] if msg_id else None
--------------------------------------------------------------------------------
/user/save_username.py:
--------------------------------------------------------------------------------
1 | import db
2 | from telebot.types import Message
3 | from config import bot
4 | from time import time
5 |
6 | def save_username(message:Message, user_id:str, new_user:bool):
7 | """ اضافة شخص الى قاعدة البيانات او تعديل اسمه
8 |
9 | المتغيرات:
10 | message (telebot.types.Message): كائن الرسالة
11 | user_id (str): الايدي الخاص بالمستخدم
12 | new_user (bool): اضافته الى قاعدة البيانات ام تغير اسمه فقط
13 | """
14 | username = message.text
15 | if username:
16 | # اذا كان الاسم امر
17 | if username.startswith('/'):
18 | if username == "/cancel":
19 | # الغاء العملية
20 | bot.reply_to(message, "تم الالغاء")
21 | else:
22 | msg = bot.reply_to(message, "للالغاء ارسل: /cancel\nالاسم المستعار يجب ان لا يبدا ب / \nحاول مجددا")
23 | bot.register_next_step_handler(msg, save_username, user_id, new_user)
24 | else:
25 | if len(username) <=10:
26 | # اذا المستخدم جديد يتم اضافته الى قاعدة البيانات
27 | if new_user:
28 | db.insert('users', (user_id, username, time(), 0, ""))
29 | # اذا قديم يتم تحديث اسمه
30 | else:
31 | db.update("users", 'username', username, 'id', user_id)
32 | bot.reply_to(message, "تم تحديث الاسم بنجاح الى '{}'".format(username))
33 | else:
34 | msg = bot.reply_to(message, "للالغاء ارسل: /cancel\nيجب ان لا يتخطى طول الاسم 10 خانات \nحاول مجددا")
35 | bot.register_next_step_handler(msg, save_username, user_id, new_user)
36 | else:
37 | msg = bot.reply_to(message, "للالغاء ارسل: /cancel\nالاسم المستعار يجب ان يكون نص\nحاول مجددا")
38 | bot.register_next_step_handler(msg, save_username, user_id, new_user)
--------------------------------------------------------------------------------
/user/sessions_time.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def sessions_time(user_id:str):
4 | """ ارجاع وقت انتهاء الجلسة التي يوجد بها المستخدم
5 |
6 | المتغيرات:
7 | user_id (str): الشخص المراد معرفة وقت انتهاء جلسته
8 |
9 | المخرجات:
10 | [float]: وقت الانتها
11 | """
12 | return db.row("chat_sessions", "user_id", user_id, "end_time")
--------------------------------------------------------------------------------
/user/username.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def username(user_id:str):
4 | """ استخراج اسم الشخص من قاعدة البيانات
5 |
6 | Args:
7 | user_id (str): الايدي الخاص بالشخص
8 |
9 | Returns:
10 | [str]: الاسم الخاص بالشخص
11 | """
12 | return db.row('users', 'id', user_id, 'username')
--------------------------------------------------------------------------------
/user/waiting.py:
--------------------------------------------------------------------------------
1 | import db
2 |
3 | def waiting(user_id:str):
4 | """ ارجاع اذا كان الشخص موجود في قائمة المنتظرين ام لا
5 |
6 | المتغيرات:
7 | user_id (str): الشخص المراد معرفة اذا كان موجود ام لا
8 |
9 | المخرجات:
10 | [bool]: موجود ام لا
11 | """
12 | return bool(list(filter(
13 | lambda u_id: u_id == user_id,
14 | db.column('waiting', 'id')
15 | )))
--------------------------------------------------------------------------------