-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.py
506 lines (432 loc) · 25 KB
/
main.py
1
2
3
4
5
6
7
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
# A project by Muhammad Mirab Br. ☘️
# Collabortors: Iliya Faramarzi
# Kara Group Management Bot
from pyrogram import Client, filters, enums, errors
import dbManagement as dbManager
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, MessageEntity
import ast
import requests
from datetool import calendar
from datetime import datetime
import emoji
import enchant
import os
dbm = dbManager.dbManager()
#Connect code to your bot
#app = Client('karaGroupManagement', api_id= your api id, api_hash= 'your api hash', bot_token= 'your bot token')
app = Client('karaGroupManagement')
bad_words = ['احمق', 'بیشعور', 'روانی']
def checkMessage(chat_ID, type):
get_settings = dbm.GetSettings(chat_ID)
settings = ['emoji', 'link', 'gif', 'sticker', 'picture', 'video', 'music', 'file', 'english', 'bad_words']
return True if get_settings[settings.index(type)] == 1 else False # Delete message if True
def settingsButtons(chat_id, user_id):
settings = dbm.GetSettings(chat_id)
"""
[0] --> emoji
[1] --> link
[2] --> git
[3] --> sticker
[4] --> picture
[5] --> video
[6] --> music
[7] --> file
[8] --> englsih
[9] --> bad_words
0 means disable and 1 means True
"""
buttons = InlineKeyboardMarkup(
[
[
InlineKeyboardButton('ایموجی✅' if settings[0] == 1 else 'ایموجی❌', callback_data = f'emoji-{chat_id}'),
InlineKeyboardButton('لینک✅' if settings[1] == 1 else 'لینک❌', callback_data = 'link-{chat_id}')
],
[
InlineKeyboardButton('گیف✅' if settings[2] == 1 else 'گیف❌', callback_data = f'gif-{chat_id}'),
InlineKeyboardButton('استیکر✅' if settings[3] == 1 else 'استیکر❌', callback_data = f'sticker-{chat_id}')
],
[
InlineKeyboardButton('عکس✅' if settings[4] == 1 else 'عکس❌', callback_data = f'picture-{chat_id}'),
InlineKeyboardButton('فیلم✅' if settings[5] == 1 else 'فیلم❌', callback_data = f'video-{chat_id}')
],
[
InlineKeyboardButton('آهنگ✅' if settings[6] == 1 else 'آهنگ❌', callback_data = f'music-{chat_id}'),
InlineKeyboardButton('فایل✅' if settings[7] == 1 else 'فایل❌', callback_data = f'file-{chat_id}')
],
[
InlineKeyboardButton('انگلیسی✅' if settings[8] == 1 else 'انگلیسی❌', callback_data = f'english-{chat_id}'),
InlineKeyboardButton('کلمات نامناسب✅' if settings[9] == 1 else 'کلمات نامناسب❌', callback_data = f'bad_words-{chat_id}')
],
[
InlineKeyboardButton('بازگشت', callback_data = f'back_to_main_menu-{user_id}')
]
]
)
return buttons
# the stage where bot is added and becomes an admin
@app.on_message(filters.service)
async def services(client, message):
chatID = dbm.getChatID(message.chat.id)
# availableGroups is the variable in which the groups that the bot is already added to are listed
availableGroups = dbm.getAvailableGroupsID()
try:
if message.chat.type != "private":
new_member_status = message.new_chat_members[0]
if new_member_status.is_self == True:
# checks wheter it was previously added to this group or not
if chatID not in availableGroups:
dbm.addToGroupSettings(chatID)
toBeEditedMessage = await app.send_message(message.chat.id, "ربات به گروه افزوده شد☘️\n\n» جهت آغاز فرآیند نصب و پیکربندی \nربات را ادمین کامل نمایید🌱")
dbm.AddAdmins(message.chat.id, f'{message.from_user.id} ')
# the message is saved so that it can later be edited as a confirmation that bot has been upgraded to admin
dbm.firstMessageEditID(chatID, toBeEditedMessage.id)
except:
pass
try:
new_member_status = message.new_chat_members[0]
except:
pass
# checking in the database if the admin has turned off the welcome feature
wetherWelcomeIsEnabled = dbm.checkWetherGroupSettingIsSet(chatID, "isWelcomeEnabled")
if wetherWelcomeIsEnabled[0] == 1:
try:
if new_member_status.is_self != True:
welcomeMessage = dbm.checkWetherGroupSettingIsSet(chatID, "welcomeMessage")
new_member = [u.mention for u in message.new_chat_members]
welcomeMessage = welcomeMessage[0].replace("[کاربر]", f"{new_member[0]}")
await app.send_message(chatID, welcomeMessage)
except:
pass
# cur.execute(
# f"SELECT panelCategoriesFlag FROM group{chatID} WHERE panelCategories = 'join'")
# wetherJoinIsEnabled = cur.fetchall()[0][0]
# if wetherJoinIsEnabled == 1:
# app.delete_messages(chat_id, message_id)
@app.on_chat_member_updated()
async def update_member(client, message):
try:
if message.old_chat_member != None and message.old_chat_member.privilegs == None:
pass
except AttributeError:
try:
member = await app.get_chat_member(message.chat.id, "me")
if message.chat.type == enums.ChatType.CHANNEL:
if member.status == enums.ChatMemberStatus.ADMINISTRATOR and message.new_chat_member.privileges.can_post_messages:
await app.send_message(message.new_chat_member.promoted_by.id, 'ربات با موفقیت در کانال ادمین شد')
elif not message.new_chat_member.privileges.can_post_messages:
await app.send_message(message.new_chat_member.promoted_by.id, 'لطفا ابتدا ربات را از کانال حذف و دوباره اضافه کنید و توجه کنید که باید هنگام اضافه کردن ربات به کانال دسترسی ارسال پیام را به ربات بدهید.')
elif message.chat.type == enums.ChatType.GROUP or message.chat.type == enums.ChatType.SUPERGROUP:
if member.status == enums.ChatMemberStatus.ADMINISTRATOR and member.user == message.new_chat_member.user:
final = ''
admins = ''
# getting the admin users to display them in the message
async for i in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS):
if not i.user.is_self:
final += '[%s](tg://useir?d=%i)\n' % (i.user.first_name, i.user.id)
if i.user.id != dbm.GetAllValues(message.chat.id)[1]:
admins += '%s ' % str(i.user.id)
dbm.AddAdmins(message.chat.id, f'{dbm.GetAllValues(message.chat.id)[1]} {admins}')
await app.edit_message_text(message.chat.id, int(dbm.getFirstMessageEditID(dbm.getChatID(message.chat.id))[0]), 'ربات با موفقیت در گروه فعال شد.\n\n ادمین های شناسایی شده:\n%s' % final, reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton('ادامه پیکربندی', url = f'https://t.me/curlymoderaotbot?start=Continue_config_{message.chat.id}')
],
]))
# removing the first message which was edited to admin confirmation
dbm.removeFirstMessageEditID(dbm.getChatID(message.chat.id))
except errors.exceptions.not_acceptable_406.ChannelPrivate:
pass
@app.on_message(filters=filters.private & filters.command("start"))
async def private(client, message):
text = message.text
text = text.replace('/start ', '')
if text == 'Continue_config_-1001908542984':
chat_id = text.replace('Continue_config_', '')
admins = []
async for admin in app.get_chat_members(chat_id, filter=enums.ChatMembersFilter.ADMINISTRATORS):
admins.append(admin.user.id)
if message.from_user.id in admins:
await app.send_message(message.from_user.id, 'با استفاده از این لنیک زیر ربات را در کانال مورد نظر ادمین کنید.', reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton('افزودن ربات به کانال', url='https://t.me/curlymoderaotbot?startchannel=true')
],
]
))
else:
await app.send_message(message.from_user.id, 'شما دسترسی کافی را برای انجام این کار ندارید.')
@app.on_message(filters.text & filters.group)
async def group_messages(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
text = message.text
try:
theMessage = message.text.split(" ")
except:
pass
if checkMessage(chat_id, 'emoji'):
if list(emoji.analyze(f'{text} a')) != []:
await app.delete_messages(chat_id, message_id)
if checkMessage(chat_id, 'link'):
if message.entities != None and message.entities[0].type == enums.MessageEntityType.URL:
await app.delete_messages(chat_id, message_id)
if checkMessage(chat_id, 'english'):
d = enchant.Dict("en_US")
for word in theMessage:
if d.check(word) == False:
break
else:
await app.delete_messages(chat_id, message_id)
if checkMessage(chat_id, 'bad_words'):
for word in theMessage:
if word in bad_words:
await app.delete_messages(chat_id, message_id)
if theMessage[0] == "تعیین" and theMessage[1] == "موقعیت":
title = ""
pt = dbm.getUserPositionDict(dbm.getChatID(message.chat.id))[0]
positionTitles = ast.literal_eval(pt) if pt != "" else {}
for i in range(2): theMessage.pop(0)
titleMessage = ' '.join(theMessage)
numberOfTags = [t for t in titleMessage if t.find("@") == 0]
if len(numberOfTags) != 0:
taggedPeople = []
for entity in range(len(message.entities)):
offset = message.entities[entity].offset
taggedPeople.append(message.text[ offset : offset + message.entities[0].length])
taggedPeopleID = await app.get_users(taggedPeople)
for i in taggedPeople: theMessage.remove(i)
title = " ".join(theMessage)
if len(title) > 16:
await message.reply("موقعیت فرد نمیتواند بیشتر از 16 کاراکتر باشد❌")
else:
for j, i in enumerate(taggedPeopleID):
if i.id not in positionTitles:
await app.promote_chat_member(message.chat.id, i.id)
await app.set_administrator_title(message.chat.id, i.id, title)
positionTitles[i.id] = title
await message.reply(f"موقعیت موردنظر '{title}' برای کاربر {taggedPeople[j]} با موفقیت ثبت شد✅")
else:
await message.reply(f"موقعیت کاربر {taggedPeople[j]} از قبل ذخیره شده است، لطفا برای تغییر موقعیت شغلی از دستور\"تغییر موقعیت\" استفاده کنید❌")
else:
#check for who the message is replied to
title = ' '.join(theMessage)
userID = message.reply_to_message.from_user.id
userName = message.reply_to_message.from_user.username
if len(title) > 16:
await message.reply("موقعیت فرد نمیتواند بیشتر از 16 کاراکتر باشد❌")
else:
if userID not in positionTitles:
await app.promote_chat_member(message.chat.id, userID) # if user is promoted to admin by another user this will throw an exception
await app.set_administrator_title(message.chat.id, userID, title)
positionTitles[userID] = title
await message.reply(f"موقعیت موردنظر '{title}' برای کاربر @{userName} با موفقیت ثبت شد✅")
else:
await message.reply(f"موقعیت کاربر {userName} از قبل ذخیره شده است، لطفا برای تغییر موقعیت شغلی از دستور\"تغییر موقعیت\" استفاده کنید❌")
dbm.updateUserPositionDict(message.chat.id, positionTitles)
elif theMessage[0] == "تغییر" and theMessage[1] == "موقعیت":
title = ""
pt = dbm.getUserPositionDict(dbm.getChatID(message.chat.id))[0]
positionTitles = ast.literal_eval(pt) if pt != "" else {}
for i in range(2): theMessage.pop(0)
titleMessage = ' '.join(theMessage)
numberOfTags = [t for t in titleMessage if t.find("@") == 0]
if len(numberOfTags) != 0:
taggedPeople = []
for entity in range(len(message.entities)):
offset = message.entities[entity].offset
taggedPeople.append(message.text[ offset : offset + message.entities[0].length])
taggedPeopleID = await app.get_users(taggedPeople)
for i in taggedPeople: theMessage.remove(i)
title = " ".join(theMessage)
if len(title) > 16:
await message.reply("موقعیت فرد نمیتواند بیشتر از 16 کاراکتر باشد❌")
else:
for j, i in enumerate(taggedPeopleID):
if i.id in positionTitles:
await app.promote_chat_member(message.chat.id, i.id)
await app.set_administrator_title(message.chat.id, i.id, title)
positionTitles[i.id] = title
await message.reply(f"موقعیت موردنظر '{title}' برای کاربر {taggedPeople[j]} با موفقیت تغییر کرد✅")
else:
await message.reply(f"موقعیت شغلیای برای کاربر موردنظر ثبت نشده است❌")
else:
#check for who the message is replied to
title = ' '.join(theMessage)
userID = message.reply_to_message.from_user.id
userName = message.reply_to_message.from_user.username
if len(title) > 16:
await message.reply("موقعیت فرد نمیتواند بیشتر از 16 کاراکتر باشد❌")
else:
if userID not in positionTitles:
await app.promote_chat_member(message.chat.id, userID)
await app.set_administrator_title(message.chat.id, userID, title)
positionTitles[userID] = title
await message.reply(f"موقعیت موردنظر '{title}' برای کاربر {taggedPeople[j]} با موفقیت تغییر کرد✅")
else:
await message.reply(f"موقعیت شغلیای برای کاربر موردنظر ثبت نشده است❌")
dbm.updateUserPositionDict(message.chat.id, positionTitles)
elif theMessage[0] == "موقعیت" and theMessage[1] == "کاربران":
pt = dbm.getUserPositionDict(dbm.getChatID(message.chat.id))[0]
positionTitles = ast.literal_eval(pt) if pt != "" else {}
users = positionTitles.keys()
userInfos = await app.get_users(users)
usernames = [i.username for i in userInfos]
titles = positionTitles.values()
userTitleText = "موقعیت های شغلی افراد تنظیم شده حاضر در گروه☘️: \n"
for i, j in zip(usernames, titles): userTitleText += f"@{i}: {j}\n"
await message.reply(userTitleText)
if text == 'تاریخ' or text == 'date':
response = requests.get('https://api.keybit.ir/time/')
resp = response.json()
time = resp['time24']['full']['en']
day = resp['date']['day']['name']
month = resp['date']['month']['name']
year = resp['date']['year']['number']['en']
days_left = resp['date']['year']['left']['days']['en']
year_animal = resp['date']['year']['animal']
leapyear = resp['date']['year']['leapyear']
data = f'ساعت: {time} ⏰\n{day} {month} {year} 📅\n امسال {leapyear} است.\n\nروز های باقیمانده تا پایان سال: {days_left} ⏲\nحیوان سال: {year_animal}'
await app.send_message(chat_id, data, reply_to_message_id = message_id)
elif theMessage[0] == 'تقویم' or theMessage[0] == 'calendar':
if theMessage[1:] != []: format = int(theMessage[1])
else: format = 1
await app.send_message(chat_id, f'<pre>{calendar(format)}</pre language="python">', parse_mode=enums.ParseMode.HTML, reply_to_message_id = message_id)
elif text == 'ساعت' or text == 'زمان' or text == 'time':
await app.send_message(chat_id, datetime.now().strftime('%H:%M:%S'), reply_to_message_id = message_id)
elif text == 'مشخصات گروه' or text == 'info':
chat = await app.get_chat(chat_id)
await app.send_message(chat_id, f'نام گروه: {chat.title}\nآیدی عددی گروه: {chat.id}\nتعداد اعضا: {chat.members_count}\nلینک گروه: {chat.invite_link if not chat.invite_link == None else "لینک دعوت وجود ندارد"}', reply_to_message_id = message_id, disable_web_page_preview=True)
elif text == 'پنل':
await app.send_message(chat_id, "لطفا یکی از گزینه های زیر را انتخاب کنید", reply_to_message_id = message_id, reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton("تنظیمات", callback_data="setting-%i" % user_id),
InlineKeyboardButton("راهنما", callback_data="help-%i" % user_id),
],
[
InlineKeyboardButton("ارتباط با ما", callback_data="contact_us-%i" % user_id),
InlineKeyboardButton('بستن پنل', callback_data='close-%i' % user_id),
]
]
))
elif text == 'ادمین ها':
await app.send_message(chat_id, dbm.GetAllValues(chat_id)[1], reply_to_message_id = message_id)
elif theMessage[0] == 'تعیین' and theMessage[1] == 'مالک' and theMessage[2] == 'تیم' and len(theMessage) == 4:
try:
await app.get_users(theMessage[3])
final = ['Reserved']
async for i in app.get_chat_members(message.chat.id, filter=enums.ChatMembersFilter.ADMINISTRATORS):
if not i.user.is_self:
if i.user.id != theMessage[-1]:
final.append(str(i.user.id))
final[0] = theMessage[-1]
dbm.AddAdmins(chat_id, ' '.join(final))
tags = ''
for id in final[1:]:
user_info = await app.get_users(id)
tags += '[%s](tg://useir?d=%s)\n' % (user_info.first_name, id)
owner_info = await app.get_users(final[0])
await app.send_message(chat_id, f'مالک تیم با موفقیت تعیین شد.\nمالک: \n[{owner_info.first_name}](tg://useir?d={final[0]})\n\n ادمین ها: \n{tags}')
except errors.exceptions.bad_request_400.UsernameInvalid:
await app.send_message(chat_id, 'لطفا در اخر پیام ایدی عددی شخصی که قصد دارید به عنوان مالک تعیین کنید را بفرستید.\nشما میتوانید با استفاده از دستور "پروفایل" ایدی عددی شخص مورد نظر رو ببینید..', reply_to_message_id = message_id)
elif text == 'پروفایل':
replyed = message.reply_to_message.from_user
count = await app.get_chat_photos_count(replyed.id)
if count != 0:
async for photo in app.get_chat_photos(replyed.id):
success = await app.download_media(photo.file_id, f'downloads\{photo.file_unique_id}.jpg')
print(success)
await app.send_photo(chat_id, f'downloads\{photo.file_unique_id}.jpg', f'نام اکانت: {replyed.first_name}\nنام کاربری: {replyed.username}\nایدی عددی: {replyed.id}\nتعداد پروفایل: {count}', reply_to_message_id = message_id)
os.remove(f'downloads\{photo.file_unique_id}.jpg')
break
else:
await app.send_photo(chat_id, 'downloads/user.png', f'نام اکانت: {replyed.first_name}\nنام کاربری: {replyed.username}\nایدی عددی: {replyed.id}\nتعداد پروفایل: {count}', reply_to_message_id = message_id)
@app.on_callback_query()
async def answer(_, callback_query):
chat_id = callback_query.message.chat.id
data = callback_query.data.split('-')
inline_id = int(callback_query.message.id)
if data[0] == 'setting':
await app.edit_message_text(chat_id, inline_id, 'به تنظیمات خوش آمدید.', reply_markup = settingsButtons(chat_id, data[1]))
elif data[0] == 'help':
await app.edit_message_text(chat_id, inline_id, 'به بخش راهنماخوش آمدید', reply_markup = InlineKeyboardMarkup(
[
[
InlineKeyboardButton('بازگشت', callback_data = f'back_to_main_menu-{data[1]}')
]
]
))
elif data[0] == 'contact_us':
await app.edit_message_text(chat_id, inline_id, 'به بخش درباره ما خوش آمدید.', reply_markup = InlineKeyboardMarkup(
[
[
InlineKeyboardButton('بازگشت', callback_data = f'back_to_main_menu-{data[1]}')
]
]
))
elif data[0] == 'close':
await app.edit_message_text(chat_id, inline_id, 'پنل با موفقیت بسته شد✅')
elif data[0] == 'back_to_main_menu':
await app.edit_message_text(chat_id, inline_id, "لطفا یکی از گزینه های زیر را انتخاب کنید", reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton("تنظیمات", callback_data="setting-%s" % data[1]),
InlineKeyboardButton("راهنما", callback_data="help-%s" % data[1]),
],
[
InlineKeyboardButton("ارتباط با ما", callback_data="contact_us-%s" % data[1]),
InlineKeyboardButton('بستن پنل', callback_data='close-%s' % data[1]),
]
]
))
elif data[0] in ['emoji', 'link', 'gif', 'sticker', 'picture', 'video', 'music', 'file', 'english', 'bad_words']:
dbm.UpdateSettins(chat_id, data[0])
await app.edit_message_text(chat_id, inline_id, 'به تنظیمات خوش آمدید.', reply_markup = settingsButtons(chat_id, data[1]))
# -------------------- Check settings to delete or keep messages ------------------------------ #
@app.on_message(filters.photo & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'picture'):
await app.delete_messages(chat_id, message_id)
@app.on_message(filters.sticker & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'sticker'):
await app.delete_messages(chat_id, message_id)
@app.on_message(filters.video & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'video'):
await app.delete_messages(chat_id, message_id)
@app.on_message(filters.audio & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'music'):
await app.delete_messages(chat_id, message_id)
@app.on_message(filters.document & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'file'):
await app.delete_messages(chat_id, message_id)
@app.on_message(filters.animation & filters.group)
async def photos(_, message):
chat_id = message.chat.id
message_id = message.id
user_id = message.from_user.id
if checkMessage(chat_id, 'gif'):
await app.delete_messages(chat_id, message_id)
# --------------------------------------------------------------------------------------------- #
if __name__ == "__main__":
print('Bot is starting ...')
app.run() # Automatically start() and idle()