Advertisement
Guest User

123

a guest
Dec 16th, 2022
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.20 KB | None | 0 0
  1. import asyncio
  2. import datetime
  3. from datetime import datetime
  4. from datetime import timedelta
  5.  
  6. import pytz
  7. from aiogram import types
  8. from aiogram.dispatcher import FSMContext
  9. from aiogram.dispatcher.filters.state import StatesGroup, State
  10. from aiogram.utils.exceptions import MessageCantBeEdited
  11.  
  12. import db
  13. from csv_writer import delete_csv_file, create_csv_file, CSV_PATH
  14. from . import texts
  15. from .db import DB
  16. from ..keyboards import admin_panel as keyboards
  17. from ..loader import dp, bot, ADMINS
  18. from ..states import Menu, AdminMessage
  19.  
  20. now_day = datetime.now().day
  21.  
  22. db_ = DB('mongodb://localhost:27017/', 'AD')
  23. loop = asyncio.get_event_loop()
  24. tasks = []
  25.  
  26.  
  27. def gethour():
  28. return datetime.now().hour + 4
  29.  
  30.  
  31. def getmin():
  32. return datetime.now().minute
  33.  
  34.  
  35. def getday():
  36. return datetime.now().day
  37.  
  38.  
  39. async def my_sleep_func():
  40. await asyncio.sleep(50)
  41.  
  42.  
  43. async def Check():
  44. global now_day
  45. while True:
  46. if now_day != getday():
  47. db_.decriment()
  48. now_day = getday()
  49. list_adv = db_.get_all_adv()
  50. for x in list_adv:
  51. for t in x['Time']:
  52. print(str(gethour()) + ':' + str(getmin()))
  53. print('' + t)
  54. t = t.replace(':', ' ').split()
  55. if gethour() == int(t[0]) or (gethour()) == 25 and int(t[0]) == 1 or (gethour()) == 26 and int(
  56. t[0]) == 2 or (gethour()) == 27 and int(t[0]) == 3 or (gethour()) == 28 and int(t[0]) == 4:
  57. print('+')
  58. if getmin() == int(t[-1]):
  59. print('+++')
  60. try:
  61. for chat in db_.get_all_chat():
  62. print('+')
  63. await bot.send_photo(int(chat['chat_id']), open(x['msg_img'], 'rb'), caption=f"""
  64. 💰 <b>На правах рекламы </b> \n \n{x['msg_text']}\n
  65. 💰 <b>На правах рекламы \n</b>
  66. """)
  67. except Exception as e:
  68. print(e)
  69. for chat in db_.get_all_chat():
  70. await bot.send_message(int(chat['chat_id']), x['msg_text'])
  71. await my_sleep_func()
  72.  
  73.  
  74. class Post:
  75. msg_id = None
  76. days = None
  77. time = None
  78.  
  79.  
  80. post = Post()
  81.  
  82.  
  83. @dp.message_handler(user_id=ADMINS, commands='check')
  84. async def show_admin_panel(message: types.message, state: FSMContext):
  85. loop = asyncio.get_event_loop()
  86. asyncio.ensure_future(Check())
  87. loop.run_forever()
  88.  
  89.  
  90. @dp.message_handler(user_id=ADMINS, commands='admin')
  91. async def show_admin_panel(message: types.message, state: FSMContext):
  92. await state.finish()
  93. kwargs = {
  94. 'text': "Нажмите на интересующий вас пункт:",
  95. 'reply_markup': keyboards.main
  96. }
  97. try:
  98. await message.edit_text(**kwargs)
  99. except MessageCantBeEdited:
  100. await message.answer(**kwargs)
  101.  
  102.  
  103. @dp.callback_query_handler(user_id=ADMINS, text_contains='words:')
  104. async def words_management(callback: types.callback_query):
  105. words = db.get_words()
  106. if callback.data.endswith("add"):
  107. await AdminMessage.add_word.set()
  108. text = f"Напишите слово для добавления"
  109. elif callback.data.endswith("del"):
  110. await AdminMessage.del_word.set()
  111. text = f"Напишите слово для удаления\nСписок слов:\n" + "\n".join(list(map(str, words)))
  112. else:
  113. text = "Список слов:\n" + "\n".join(list(map(str, words)))
  114.  
  115. await callback.message.edit_text(text, reply_markup=keyboards.back)
  116. await callback.answer()
  117.  
  118.  
  119. @dp.callback_query_handler(user_id=ADMINS, text_contains='stop:')
  120. async def stop_management(callback: types.callback_query):
  121. if callback.data == 'stop:':
  122. await callback.message.edit_text('Стоп-слова', reply_markup=keyboards.stop)
  123. return await callback.answer()
  124. stop = db.get_stop()
  125. if callback.data.endswith("add"):
  126. await AdminMessage.add_stop.set()
  127. text = f"Напишите слово для добавления"
  128. elif callback.data.endswith("del"):
  129. await AdminMessage.del_stop.set()
  130. text = f"Напишите слово для удаления\nСписок слов:\n" + "\n".join(list(map(str, stop)))
  131. else:
  132. text = "Список слов:\n" + "\n".join(list(map(str, stop)))
  133.  
  134. await callback.message.edit_text(text, reply_markup=keyboards.back)
  135. await callback.answer()
  136.  
  137.  
  138. @dp.callback_query_handler(user_id=ADMINS, text='logs')
  139. async def logs_management(callback: types.CallbackQuery):
  140. csv_file = open(CSV_PATH, 'rb')
  141. await callback.message.answer_document(csv_file)
  142. delete_csv_file()
  143. create_csv_file()
  144.  
  145.  
  146. @dp.message_handler(user_id=ADMINS, state=AdminMessage.add_word)
  147. async def add_word(message: types.Message, state: FSMContext):
  148. # await state.finish()
  149. db.add_word(message.text)
  150. await message.answer('Готово', reply_markup=keyboards.back)
  151.  
  152.  
  153. @dp.message_handler(user_id=ADMINS, state=AdminMessage.del_word)
  154. async def del_word(message: types.Message, state: FSMContext):
  155. # await state.finish()
  156. db.del_word(message.text)
  157. await message.answer('Готово', reply_markup=keyboards.back)
  158.  
  159.  
  160. @dp.message_handler(user_id=ADMINS, state=AdminMessage.add_stop)
  161. async def add_stop(message: types.Message, state: FSMContext):
  162. # await state.finish()
  163. db.add_stop(message.text)
  164. await message.answer('Готово', reply_markup=keyboards.back)
  165.  
  166.  
  167. @dp.message_handler(user_id=ADMINS, state=AdminMessage.del_stop)
  168. async def del_stop(message: types.Message, state: FSMContext):
  169. # await state.finish()
  170. db.del_stop(message.text)
  171. await message.answer('Готово', reply_markup=keyboards.back)
  172.  
  173.  
  174. @dp.callback_query_handler(user_id=ADMINS, text_contains='chats:')
  175. async def chat_management(callback: types.callback_query):
  176. chat_id = callback.message.chat.id
  177.  
  178. if callback.data.endswith("add"):
  179. db.add_chat(chat_id)
  180. text = f"Добавлен чат: <code>{chat_id}</code>"
  181. elif callback.data.endswith("del"):
  182. db.del_chat(chat_id)
  183. print('ok2')
  184. text = f"Удалён чат: <code>{chat_id}</code>"
  185. elif callback.data.endswith("show"):
  186. chats = db.get_chats()
  187. text = "Список чатов:\n" + "\n".join(list(map(str, chats)))
  188.  
  189. await callback.message.edit_text(text)
  190. await callback.answer()
  191.  
  192.  
  193. @dp.callback_query_handler(user_id=ADMINS, text='show_settings')
  194. async def show_current_settings(callback: types.callback_query):
  195. try:
  196. settings = db.get_chat(callback.message.chat.id)
  197. if settings:
  198. text = (
  199. "Настройки для чата <code>%s</code>\n\n"
  200. "Кулдаун (в часах): <b>%s</b>\n"
  201. "Количество анализируемых сообщений <b>%s</b>\n"
  202. "Задержка удаления уведомления: <b>%s мин</b>\n"
  203. "Минимальная длинна анализируемого сообщения: <b>%s</b>"
  204. )
  205. else:
  206. text = "Сначала добавьте чат!"
  207. await callback.message.edit_text(
  208. text % settings,
  209. reply_markup=keyboards.back
  210. )
  211. await callback.answer()
  212. except:
  213. await callback.answer('Данного чата нет в базе данных! С начала добавьте его', show_alert=True)
  214.  
  215.  
  216. @dp.callback_query_handler(user_id=ADMINS, text_contains='set:')
  217. async def settings_management(callback: types.callback_query):
  218. setting = callback.data.split(':')[1]
  219. await eval(f"Menu.set.{setting}.set()")
  220. await callback.message.edit_text(
  221. texts.settings_hintings[setting],
  222. reply_markup=keyboards.back
  223. )
  224. await callback.answer()
  225.  
  226.  
  227. @dp.callback_query_handler(user_id=ADMINS, text=['cancel', 'back'], state='*')
  228. async def back_to_admin_panel(callback: types.callback_query, state: FSMContext):
  229. await state.finish()
  230. await show_admin_panel(callback.message, state)
  231. await callback.answer()
  232.  
  233.  
  234. @dp.message_handler(state=Menu.set)
  235. async def set_setting(message: types.message, state: FSMContext, raw_state: str):
  236. setting, value = raw_state.split(':')[1], message.text
  237.  
  238. async def wrong_value():
  239. await message.answer(
  240. "Неверное значение!\nПопробуйте ещё "
  241. "раз, или нажмите \"Отмена\"",
  242. reply_markup=keyboards.cancel
  243. )
  244.  
  245. try:
  246. value = int(value)
  247. except ValueError:
  248. await wrong_value()
  249. return
  250.  
  251. ranges = {
  252. 'cooldown': range(1, 73),
  253. 'limit_messages': range(1, 151),
  254. 'delay_delete_notification': range(1, 11),
  255. 'minimum_len_message': range(10, 11)
  256. }
  257. if value not in ranges[setting]:
  258. await wrong_value()
  259. return
  260.  
  261. db.update_setting(
  262. message.chat.id,
  263. column_name=setting,
  264. value=value
  265. )
  266. await message.answer("Новое значение установлено!")
  267. await state.finish()
  268.  
  269.  
  270. msg_cancel = types.InlineKeyboardMarkup(row_width=1)
  271. msg_cancel_btn = types.InlineKeyboardButton(text='Отмена', callback_data='send_message_cancel')
  272. msg_send_btn = types.InlineKeyboardButton(text='Отправить', callback_data='send_msg')
  273. msg_cancel.add(msg_cancel_btn)
  274.  
  275.  
  276. @dp.message_handler(user_id=ADMINS, commands='panic')
  277. async def panic_cmd(message: types.message, state: FSMContext):
  278. global tasks
  279. for task in tasks:
  280. tasks[tasks.index(task)].cancel()
  281. tasks.pop(tasks.index(task))
  282. await bot.send_message(message.from_user.id, 'Все отложенные сообщения удалены!')
  283.  
  284.  
  285. @dp.callback_query_handler(user_id=ADMINS, text='send_message')
  286. async def choose_type_msg(c: types.CallbackQuery):
  287. msg_type = types.InlineKeyboardMarkup(row_width=2)
  288. msg_type_instaln = types.InlineKeyboardButton(text='Моментально', callback_data='instant_msg')
  289. msg_type_delay = types.InlineKeyboardButton(text='Отложить', callback_data='delay_msg')
  290. msg_type.add(msg_type_instaln, msg_type_delay)
  291. await AdminMessage.msg_type.set()
  292. try:
  293. await bot.edit_message_text('Выберите, тип отправки сообщения: ', c.from_user.id, c.message.message_id,
  294. reply_markup=msg_type.add(msg_cancel_btn))
  295. except:
  296. await c.answer('Используйте отправку сообщений только в лс бота!', show_alert=True)
  297.  
  298.  
  299. @dp.callback_query_handler(state='*', text='send_message_cancel')
  300. async def cancel_handler(c: types.CallbackQuery, state: FSMContext):
  301. current_state = await state.get_state()
  302. if current_state is None:
  303. await bot.send_message(c.from_user.id, 'Отменено', reply_markup=types.ReplyKeyboardRemove())
  304. elif current_state.split(':')[0] == 'AdminMessage':
  305. await state.finish()
  306. await bot.delete_message(c.from_user.id, c.message.message_id)
  307. await bot.send_message(c.from_user.id, 'Отменено', reply_markup=types.ReplyKeyboardRemove())
  308.  
  309.  
  310. @dp.callback_query_handler(text='instant_msg', state=AdminMessage.msg_type)
  311. @dp.callback_query_handler(text='delay_msg', state=AdminMessage.msg_type)
  312. async def insert_msg(c: types.CallbackQuery, state: FSMContext):
  313. async with state.proxy() as data:
  314. data['msg_type'] = c.data
  315. await bot.delete_message(c.from_user.id, c.message.message_id)
  316. await bot.send_message(c.from_user.id, 'Введите сообщение, которое нужно отправить', reply_markup=msg_cancel)
  317. await AdminMessage.next()
  318.  
  319.  
  320. class OutputFormSetDay(StatesGroup):
  321. Output = State()
  322.  
  323.  
  324. @dp.message_handler(content_types=['any'], state=AdminMessage.msg)
  325. async def select_chats(message: types.Message, state: FSMContext):
  326. async with state.proxy() as data:
  327. data['msg'] = message
  328. data['content_type'] = message.content_type
  329. data['chats'] = []
  330. chats_id = db.get_chats()
  331. chats_mkp = types.InlineKeyboardMarkup(row_width=1)
  332. chats_mkp_ = types.InlineKeyboardMarkup(row_width=1)
  333. for chat in chats_id:
  334. try:
  335. chat_info = await bot.get_chat(chat)
  336. chats_mkp.add(types.InlineKeyboardButton(text='[-] ' + chat_info.title, callback_data='chat_' + str(chat)))
  337. except:
  338. db.del_chat(int(chat))
  339. await bot.send_message(message.from_user.id, 'Чат - ' + str(
  340. chat) + ' есть в базе данных, но в нем нету бота. \nДля избежания ошибки, чат был удален с базы данных!')
  341. chats_mkp.add(types.InlineKeyboardButton(text='Ввести информацию', callback_data='description'))
  342. if data['msg_type'] == 'delay_msg':
  343. await bot.send_message(message.from_user.id, 'Введите количество дней отправки сообщений (Например : 1)\n',
  344. reply_markup=chats_mkp_.add(msg_cancel_btn))
  345. post.msg_id = message
  346. await OutputFormSetDay.Output.set()
  347. return None
  348. await data['msg'].send_copy(message.from_user.id)
  349. await bot.send_message(message.from_user.id, 'Выберите чаты, куда отправить данное сообщение',
  350. reply_markup=chats_mkp.add(msg_cancel_btn))
  351. await AdminMessage.next()
  352.  
  353.  
  354. @dp.message_handler(state='*', commands='cancel')
  355. @dp.message_handler(state=OutputFormSetDay.Output)
  356. async def process_name(message: types.Message, state: FSMContext):
  357. Output = message.text
  358. post.days = Output
  359. chats_mkp = types.InlineKeyboardMarkup(row_width=1)
  360. await bot.send_message(message.from_user.id,
  361. "Введите время отправки сообщения через '/'\n Например(14:45/13:35/18:50)",
  362. reply_markup=chats_mkp.add(msg_cancel_btn))
  363. await OutputFormSetTime.Output.set()
  364.  
  365.  
  366. class OutputFormSetImg(StatesGroup):
  367. Output = State()
  368.  
  369.  
  370. class OutputFormSetTime(StatesGroup):
  371. Output = State()
  372.  
  373.  
  374. filepath = 'C:/Users/nikit/PycharmProjectsCumShot/photos/'
  375.  
  376.  
  377. @dp.message_handler(state='*', commands='cancel')
  378. @dp.message_handler(state=OutputFormSetTime.Output)
  379. async def process_time(message: types.Message, state: FSMContext):
  380. Output = message.text
  381. post.time = Output.replace('/', ' ').split()
  382. chats_mkp = types.InlineKeyboardMarkup(row_width=1)
  383. await bot.send_message(message.from_user.id,
  384. "Отправьте медиа документ к сообщению \n Или 'Нет'",
  385. reply_markup=chats_mkp.add(msg_cancel_btn))
  386. await OutputFormSetImg.Output.set()
  387.  
  388.  
  389. @dp.message_handler(state='*', commands='cancel')
  390. @dp.message_handler(state=OutputFormSetImg.Output, content_types=['any'])
  391. async def proctyess_img(message: types.Message, state: FSMContext):
  392. Output = message.text
  393. if Output == 'Нет':
  394. db_.create_ADV(post.msg_id.text, post.days, post.time)
  395. await bot.send_message(message.from_user.id, "Баннер успешно создан!")
  396. else:
  397. file_info = await bot.get_file(message.photo[len(message.photo) - 1].file_id)
  398. downloaded_file = await bot.download_file(file_info.file_path)
  399. src = filepath + f'{post.msg_id.message_id}.png'
  400. with open(src, 'wb') as new_file:
  401. new_file.write(downloaded_file.getvalue())
  402. db_.create_ADV(post.msg_id.text, post.days, post.time, src)
  403. await bot.send_message(message.from_user.id, "Баннер успешно создан!")
  404. await state.finish()
  405.  
  406.  
  407. @dp.callback_query_handler(text_contains='chat_', state=AdminMessage.chats)
  408. async def choose_chat(c: types.CallbackQuery, state: FSMContext):
  409. async with state.proxy() as data:
  410. data['chats'].append(c.data.split('_')[1])
  411. chats_id = db.get_chats()
  412. chats = ''
  413. for chat in data['chats']:
  414. chat_info = await bot.get_chat(chat)
  415. chats = chats + chat_info.title + '\n'
  416. chats_mkp = types.InlineKeyboardMarkup(row_width=2)
  417. for chat in chats_id:
  418. try:
  419. chat_info = await bot.get_chat(chat)
  420. if str(chat) in data['chats']:
  421. chats_mkp.add(
  422. types.InlineKeyboardButton(text='[✅] ' + chat_info.title, callback_data='selectChat_' + str(chat)))
  423. else:
  424. chats_mkp.add(
  425. types.InlineKeyboardButton(text='[-] ' + chat_info.title, callback_data='chat_' + str(chat)))
  426. except:
  427. db.del_chat(int(chat))
  428. await bot.send_message(c.from_user.id, 'Чат - ' + str(
  429. chat) + ' есть в базе данных, но в нем нету бота. \nДля избежания ошибки, чат был удален с базы данных!')
  430. chats_mkp.add(types.InlineKeyboardButton(text='Ввести информацию', callback_data='description'))
  431. if chats == '':
  432. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  433. c.message.message_id, reply_markup=chats_mkp.add(msg_cancel_btn))
  434. else:
  435. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  436. c.message.message_id, reply_markup=chats_mkp.add(msg_send_btn, msg_cancel_btn))
  437.  
  438.  
  439. @dp.callback_query_handler(text_contains='selectChat_', state=AdminMessage.chats)
  440. async def choose_chat(c: types.CallbackQuery, state: FSMContext):
  441. async with state.proxy() as data:
  442. for i in range(5):
  443. try:
  444. data['chats'].remove(c.data.split('_')[1])
  445. except:
  446. pass
  447. chats_id = db.get_chats()
  448. chats = ''
  449. for chat in data['chats']:
  450. chat_info = await bot.get_chat(chat)
  451. chats = chats + chat_info.title + '\n'
  452. chats_mkp = types.InlineKeyboardMarkup(row_width=2)
  453. for chat in chats_id:
  454. try:
  455. chat_info = await bot.get_chat(chat)
  456. if str(chat) in data['chats']:
  457. chats_mkp.add(
  458. types.InlineKeyboardButton(text='[✅] ' + chat_info.title, callback_data='selectchat_' + str(chat)))
  459. else:
  460. chats_mkp.add(
  461. types.InlineKeyboardButton(text='[-] ' + chat_info.title, callback_data='chat_' + str(chat)))
  462. except:
  463. db.del_chat(int(chat))
  464. await bot.send_message(c.from_user.id, 'Чат - ' + str(
  465. chat) + ' есть в базе данных, но в нем нету бота. \nДля избежания ошибки, чат был удален с базы данных!')
  466. chats_mkp.add(types.InlineKeyboardButton(text='Ввести информацию', callback_data='description'))
  467. if chats == '':
  468. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  469. c.message.message_id, reply_markup=chats_mkp.add(msg_cancel_btn))
  470. else:
  471. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  472. c.message.message_id, reply_markup=chats_mkp.add(msg_send_btn, msg_cancel_btn))
  473.  
  474.  
  475. @dp.callback_query_handler(text='description', state=AdminMessage.chats)
  476. async def insert_descriprion(c: types.CallbackQuery, state: FSMContext):
  477. back_to_chats = types.InlineKeyboardMarkup(row_width=1)
  478. await bot.edit_message_text('Введите информацию:', c.from_user.id, c.message.message_id,
  479. reply_markup=back_to_chats.add(
  480. types.InlineKeyboardButton('Назад', callback_data='back_to_chats')))
  481. await AdminMessage.next()
  482.  
  483.  
  484. @dp.message_handler(state=AdminMessage.description)
  485. async def descriptions(message: types.Message, state: FSMContext):
  486. async with state.proxy() as data:
  487. if data['content_type'] == 'text':
  488. data['msg'].text = '💰 <b>' + 'На правах рекламы' + '</b> \n \n' + data[
  489. 'msg'].text + '\n \n 💰 <b>' + 'На правах рекламы' + '</b> \n \n'
  490. await bot.send_message(message.from_user.id, data['msg'].text)
  491. elif data['content_type'] == 'photo':
  492. if data['msg'].caption:
  493. data['msg'].caption = '💰 <b>' + 'На правах рекламы' + '</b> \n \n' + data[
  494. 'msg'].caption + '💰 <b>' + 'На правах рекламы' + '</b> \n \n'
  495. else:
  496. data[
  497. 'msg'].caption = '💰 <b>' + 'На правах рекламы' + '</b> \n \n' + '💰 <b>' + 'На правах рекламы' + '</b> \n \n'
  498. elif data['content_type'] == 'video':
  499. if data['msg'].caption:
  500. data['msg'].caption = '💰 <b>' + 'На правах рекламы' + '</b> \n \n' + data[
  501. 'msg'].caption + '💰 <b>' + 'Нна правах рекламы' + '</b> \n \n'
  502. else:
  503. data[
  504. 'msg'].caption = '💰 <b>' + 'Текст на правах рекламы' + '</b> \n \n' + '💰 <b>' + 'Текст на правах рекламы' + '</b> \n \n'
  505. await bot.send_video(message.from_user.id, data['msg'].video.file_id, caption=data['msg'].caption)
  506. else:
  507. state.finish()
  508. await bot.send_message(message.from_user.id, 'Принимаем только текст, фото и видео!')
  509. chats_id = db.get_chats()
  510. chats = ''
  511. for chat in data['chats']:
  512. chat_info = await bot.get_chat(chat)
  513. chats = chats + chat_info.title + '\n'
  514. chats_mkp = types.InlineKeyboardMarkup(row_width=2)
  515. for chat in chats_id:
  516. chat_info = await bot.get_chat(chat)
  517. if str(chat) in data['chats']:
  518. chats_mkp.add(
  519. types.InlineKeyboardButton(text='[✅] ' + chat_info.title, callback_data='selectchat_' + str(chat)))
  520. else:
  521. chats_mkp.add(types.InlineKeyboardButton(text='[-] ' + chat_info.title, callback_data='chat_' + str(chat)))
  522. if chats == '':
  523. await bot.send_message(message.from_user.id, 'Сообщение будет отправлено в данные чаты: \n \n' + chats,
  524. reply_markup=chats_mkp.add(msg_cancel_btn))
  525. else:
  526. await bot.send_message(message.from_user.id, 'Сообщение будет отправлено в данные чаты: \n \n' + chats,
  527. reply_markup=chats_mkp.add(msg_send_btn, msg_cancel_btn))
  528. await AdminMessage.previous()
  529.  
  530.  
  531. @dp.callback_query_handler(text='back_to_chats', state=AdminMessage.description)
  532. async def insert_descriprion(c: types.CallbackQuery, state: FSMContext):
  533. async with state.proxy() as data:
  534. pass
  535. chats_id = db.get_chats()
  536. chats = ''
  537. for chat in data['chats']:
  538. chat_info = await bot.get_chat(chat)
  539. chats = chats + chat_info.title + '\n'
  540. chats_mkp = types.InlineKeyboardMarkup(row_width=2)
  541. for chat in chats_id:
  542. chat_info = await bot.get_chat(chat)
  543. if str(chat) in data['chats']:
  544. chats_mkp.add(
  545. types.InlineKeyboardButton(text='[✅] ' + chat_info.title, callback_data='selectchat_' + str(chat)))
  546. else:
  547. chats_mkp.add(types.InlineKeyboardButton(text='[-] ' + chat_info.title, callback_data='chat_' + str(chat)))
  548. chats_mkp.add(types.InlineKeyboardButton(text='Ввести информацию', callback_data='description'))
  549. if chats == '':
  550. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  551. c.message.message_id, reply_markup=chats_mkp.add(msg_cancel_btn))
  552. else:
  553. await bot.edit_message_text('Сообщение будет отправлено в данные чаты: \n \n' + chats, c.from_user.id,
  554. c.message.message_id, reply_markup=chats_mkp.add(msg_send_btn, msg_cancel_btn))
  555. await AdminMessage.previous()
  556.  
  557.  
  558. @dp.callback_query_handler(text='send_msg', state=AdminMessage.chats)
  559. async def send_msg_chats(c: types.CallbackQuery, state: FSMContext):
  560. async with state.proxy() as data:
  561. pass
  562. if data['msg_type'] == 'instant_msg':
  563. await bot.delete_message(c.from_user.id, c.message.message_id)
  564. await bot.send_message(c.from_user.id, 'Рассылка началась!')
  565. if data['content_type'] == 'text':
  566. for chat in data['chats']:
  567. await bot.send_message(int(chat), data['msg'].text)
  568. elif data['content_type'] == 'photo':
  569. for chat in data['chats']:
  570. await bot.send_photo(int(chat), data['msg'].photo[0].file_id, data['msg'].caption)
  571. elif data['content_type'] == 'video':
  572. for chat in data['chats']:
  573. await bot.send_video(int(chat), data['msg'].video.file_id, caption=data['msg'].caption)
  574. await bot.send_message(c.from_user.id, 'Рассылка окончена!')
  575. await state.finish()
  576.  
  577. elif data['msg_type'] == 'delay_msg':
  578. await bot.delete_message(c.from_user.id, c.message.message_id)
  579. await bot.send_message(c.from_user.id, 'Введите время отправки сообщения в формате чч:мм',
  580. reply_markup=msg_cancel)
  581. await AdminMessage.set_time.set()
  582.  
  583.  
  584. @dp.message_handler(state=AdminMessage.set_time)
  585. async def set_time(message: types.Message, state: FSMContext):
  586. async with state.proxy() as data:
  587. data['set_time'] = message.text
  588. datas = [data['msg'], data['content_type'], data['chats'], data['set_time'], message.from_user.id]
  589. await bot.send_message(message.from_user.id, 'Рассылка начата!')
  590. global tasks
  591. task = asyncio.ensure_future(scheduled_sender(datas))
  592. tasks.append(task)
  593. await state.finish()
  594.  
  595.  
  596. async def scheduled_sender(data):
  597. task = ''
  598. message = data[0]
  599. content_type = data[1]
  600. chates = data[2]
  601. interval = data[3]
  602. admin_id = data[4]
  603. do_it = 0
  604. while True:
  605. if do_it == 1:
  606. for chat in chates:
  607. try:
  608. if content_type == 'text':
  609. await bot.send_message(int(chat), message.text)
  610. elif content_type == 'photo':
  611. await bot.send_photo(int(chat), message.photo[0].file_id, message.caption)
  612. elif content_type == 'video':
  613. await bot.send_video(int(chat), message.video.file_id, caption=message.caption)
  614. except Exception as ex:
  615. print(ex)
  616. await bot.send_message(admin_id, 'Рассылка окончена!')
  617. return await del_task(task)
  618. else:
  619. task = (tasks[-1])
  620. do_it = do_it + 1
  621. a = timedelta(hours=int(interval.split(':')[0]), minutes=int(interval.split(':')[1]))
  622. b = timedelta(hours=datetime.now(pytz.timezone('Europe/Moscow')).time().hour,
  623. minutes=datetime.now(pytz.timezone('Europe/Moscow')).time().minute,
  624. seconds=datetime.now(pytz.timezone('Europe/Moscow')).time().second)
  625. c = a - b
  626. try:
  627. d = str(c).split(', ')[1].split(':')
  628. except:
  629. d = str(c).split(':')
  630. seconds = (int(d[0]) * 60 + int(d[1])) * 60 + int(d[2])
  631. await asyncio.sleep(seconds)
  632.  
  633.  
  634. async def del_task(task):
  635. global tasks
  636. tasks[tasks.index(task)].cancel()
  637. tasks.remove(task)
  638.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement