├── README.md ├── bot.py ├── config.py ├── create_tables.sql ├── mybotdata.py ├── mybotfunctions.py ├── requirements.txt └── withstickers.py /README.md: -------------------------------------------------------------------------------- 1 | #### Installation: 2 | 3 | `pip install --upgrade pip` 4 | 5 | `pip install -r requirements.txt` 6 | 7 | create MySQL database and run `create_tables.sql` 8 | 9 | `python3 bot.py` 10 | 11 | 12 | -------------------------------------------------------------------------------- /bot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import random 4 | from datetime import datetime 5 | from threading import Thread 6 | from time import sleep 7 | 8 | import schedule 9 | import telebot 10 | from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton 11 | 12 | import config 13 | import mybotdata as bdat 14 | import mybotfunctions as bfunc 15 | import withstickers as stick 16 | 17 | bot = telebot.TeleBot(config.token, skip_pending=True) 18 | 19 | bot.message_handler() 20 | def update_user_data(message): 21 | bfunc.ex_command( 22 | "update bot_users set username = '@" + str(message.from_user.username) + "' where chat_id = '" + str( 23 | message.chat.id) + "';") 24 | bfunc.ex_command( 25 | "update bot_users set user_id = '" + str(message.from_user.id) + "' where chat_id = '" + str( 26 | message.chat.id) + "';") 27 | bfunc.ex_command( 28 | "update bot_users set first_name = '" + str(message.from_user.first_name) + "' where chat_id = '" + str( 29 | message.chat.id) + "';") 30 | bfunc.ex_command( 31 | "update bot_users set last_name = '" + str(message.from_user.last_name) + "' where chat_id = '" + str( 32 | message.chat.id) + "';") 33 | 34 | 35 | @bot.message_handler(content_types=['video_note']) 36 | def get_VideoNote(message): 37 | file_id = message.video_note.file_id 38 | if str(message.chat.id) in bdat.authors_id: 39 | bfunc.ex_command("INSERT INTO video_notes (date, file_id, chat_id, `trigger`) VALUES (CURRENT_TIMESTAMP,'" + str( 40 | file_id) + "', '" + str(message.chat.id) + "', 1);") 41 | 42 | 43 | @bot.message_handler(content_types=['voice']) 44 | def get_voice(message): 45 | file_id = message.voice.file_id 46 | if str(message.chat.id) == bdat.authors_id[0]: 47 | bfunc.ex_command( 48 | "INSERT INTO voices (date, file_id, chat_id) VALUES (CURRENT_TIMESTAMP,'" + str(file_id) + "', '" + str( 49 | message.chat.id) + "');") 50 | else: 51 | bot.send_message(message.chat.id, 52 | 'Спасибо, мы приняли ваше голосовое сообщение, оно будет рассмотрено модератором.') 53 | markup = InlineKeyboardMarkup() 54 | markup.row_width = 2 55 | markup.add(InlineKeyboardButton("Принять", callback_data="cb_yes_first", one_time_keyboard=True), 56 | InlineKeyboardButton("Отклонить", callback_data="cb_no", one_time_keyboard=True)) 57 | # bot.send_voice(bdat.authors_id[0], file_id, caption=f'{message.chat.id}', reply_markup=markup) 58 | bot.send_voice(bdat.authors_id[1], file_id, caption=f'{message.chat.id}', reply_markup=markup) 59 | bot.send_voice(bdat.authors_id[2], file_id, caption=f'{message.chat.id}', reply_markup=markup) 60 | 61 | 62 | @bot.callback_query_handler(func=lambda call: True) 63 | def callback_query(call): 64 | if call.data == "cb_yes_first": 65 | new_markup = InlineKeyboardMarkup() 66 | new_markup.row_width = 2 67 | new_markup.add(InlineKeyboardButton("Принять войс", callback_data="cb_yes", one_time_keyboard=True), 68 | InlineKeyboardButton("Отклонить войс (удалить)", callback_data="cb_no", one_time_keyboard=True)) 69 | bot.send_voice(bdat.authors_id[0], call.message.voice.file_id, caption=call.message.caption, 70 | reply_markup=new_markup) 71 | bot.answer_callback_query(call.id, "Войс добавлен в базу данных") 72 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 73 | elif call.data == "cb_yes": 74 | bfunc.ex_command("INSERT INTO voices (date, file_id, chat_id, `trigger`) VALUES (CURRENT_TIMESTAMP,'" + str( 75 | call.message.voice.file_id) + "', '" + str(call.message.caption) + "', 1);") 76 | 77 | bot.answer_callback_query(call.id, "Войс добавлен в базу данных") 78 | bot.send_message(call.message.caption, 79 | 'Ваше голосовое сообщение прошло модерацию. Теперь его смогут прослушать другие пользователи, когда обратятся за вдохновением.') 80 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 81 | 82 | elif call.data == "cb_no": 83 | bot.answer_callback_query(call.id, "Войс проигнорирован") 84 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 85 | 86 | elif call.data == 'cb_voice': 87 | bot.answer_callback_query(call.id, "Буду отправлять голосовыми сообщениями") 88 | bfunc.ex_command( 89 | "update bot_users set achieve_method = '" + "voice" + "' where chat_id = '" + str(call.message.chat.id) + "';") 90 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 91 | 92 | elif call.data == 'cb_text': 93 | bot.answer_callback_query(call.id, "Буду отправлять текстовыми сообщениями") 94 | bfunc.ex_command( 95 | "update bot_users set achieve_method = '" + "text" + "' where chat_id = '" + str(call.message.chat.id) + "';") 96 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 97 | 98 | elif call.data == 'cb_video_note': 99 | bot.answer_callback_query(call.id, "Буду отправлять круглыми видеосообщениями") 100 | bfunc.ex_command( 101 | "update bot_users set achieve_method = '" + "video_note" + "' where chat_id = '" + str( 102 | call.message.chat.id) + "';") 103 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 104 | 105 | if call.data == "cb_insp_text_yes": 106 | bfunc.ex_command( 107 | "INSERT INTO texts (date, text, chat_id, `trigger`) VALUES (CURRENT_TIMESTAMP,'" + call.message.text + "', '" + str( 108 | call.message.chat.id) + "', 1);") 109 | bot.answer_callback_query(call.id, "Текст добавлен") 110 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 111 | 112 | # bot.send_message(call.message.caption, 'Ваше текстовое сообщение прошло модерацию. Теперь его смогут прослушать другие пользователи, когда обратятся за вдохновением.') 113 | elif call.data == "cb_insp_text_no": 114 | bot.answer_callback_query(call.id, "Текст проигнорирован (все ок, больше жать не надо)") 115 | bot.edit_message_reply_markup(chat_id=call.message.chat.id, message_id=call.message.id, reply_markup=None) 116 | 117 | 118 | @bot.message_handler(commands=['set_notification', 'stop', 'menu', 'settings']) 119 | def set_notification(message): 120 | update_user_data(message) 121 | bot.send_message(message.chat.id, 'Во сколько тебе напомнить о практике благодарности? (по часовому поясу MSK)', 122 | reply_markup=bdat.many_moments) 123 | bot.register_next_step_handler(message, set_new_time) 124 | 125 | # ONBOARDING 126 | @bot.message_handler(commands=['start', 'help']) 127 | def welcome_message(message): 128 | if message.chat.id in bfunc.to_id_list(bfunc.data_command("select chat_id from bot_users")): 129 | bot.send_message(message.chat.id, "Вы уже прошли регистрацию в боте. Ты в главном меню", 130 | reply_markup=bdat.main_menu_buttons) 131 | else: 132 | bfunc.ex_command( 133 | "insert into bot_users(chat_id, date) values('" + str(message.chat.id) + "', CURRENT_TIMESTAMP)") 134 | update_user_data(message) 135 | bot.send_message(message.chat.id, bdat.welc_text, reply_markup=bdat.yes_no) 136 | bot.register_next_step_handler(message, _2) 137 | 138 | 139 | def _2(message): 140 | if message.text == 'Да': 141 | bot.send_message(message.chat.id, 142 | 'Отлично! Используя практику благодарности, ты можешь стать позитивнее и счастливее. Так думают не только психологи, но и ученые.', 143 | reply_markup=bdat.aga) 144 | bot.register_next_step_handler(message, _1_3) 145 | elif message.text == 'Нет': 146 | bot.send_message(message.chat.id, 147 | 'Практика благодарности — работающий способ улучшить своё благополучие и качество жизни. Она помогает сформировать привычку лучше относиться к себе и замечать больше хорошего.\n\n Кстати, практика благодарности используется в научно доказанной когнитивно-поведенческой терапии!', 148 | reply_markup=bdat.what_to_do) 149 | bot.register_next_step_handler(message, _2_3) 150 | else: 151 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 152 | bot.register_next_step_handler(message, _2) 153 | 154 | 155 | def _1_3(message): 156 | bot.send_message(message.chat.id, 157 | 'Сейчас приступим! Но для начала мне нужно чуть больше узнать о тебе. Как я могу к тебе обращаться? (Напиши имя)', 158 | reply_markup=bdat.empty) 159 | bot.register_next_step_handler(message, your_name) 160 | 161 | 162 | def _2_3(message): 163 | bot.send_message(message.chat.id, 164 | 'Все очень просто! Тебе нужно каждый день записывать что-то, за что ты ощущаешь благодарность.') 165 | bot.send_message(message.chat.id, 166 | 'Подойдут любые штуки, даже самые небольшие. Можно поблагодарить себя за вкусный обед, хорошую работу, прогулку, встречу с другом. Даже если что-то не получилось, важно поблагодарить себя за эту попытку.', 167 | reply_markup=bdat.lets_try) 168 | bot.register_next_step_handler(message, _1_3) 169 | 170 | 171 | def your_name(message): 172 | name = message.text 173 | bfunc.ex_command("update bot_users set nickname = '" + name + "' where chat_id = '" + str(message.chat.id) + "';") 174 | bot.send_message(message.chat.id, 175 | "Хорошо, " + name + "! Как ты хочешь говорить о своих благодарностях?\n\n«Я благодарен» или «Я благодарна»", 176 | reply_markup=bdat.gender) 177 | bot.register_next_step_handler(message, your_gender) 178 | 179 | 180 | def your_gender(message): 181 | if message.text == 'Я благодарен': 182 | bfunc.ex_command("update bot_users set gender = 'male' where chat_id = '" + str(message.chat.id) + "';") 183 | elif message.text == 'Я благодарна': 184 | bfunc.ex_command("update bot_users set gender = 'female' where chat_id = '" + str(message.chat.id) + "';") 185 | else: 186 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 187 | bot.register_next_step_handler(message, your_gender) 188 | bot.send_message(message.chat.id, bfunc.gender_text(message.chat.id, 'Ура! Ты готов записать первую благодарность?', 189 | 'Ура! Ты готова записать первую благодарность?'), 190 | reply_markup=bdat.readiness) 191 | bot.register_next_step_handler(message, is_ready) 192 | 193 | 194 | def is_ready(message): 195 | if message.text == 'Да!': 196 | bot.send_message(message.chat.id, 197 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 198 | reply_markup=bdat.empty) 199 | bot.register_next_step_handler(message, write_first_grate) 200 | elif message.text == 'Не знаю, что написать': 201 | ready_to_feel_keyb = telebot.types.ReplyKeyboardMarkup(True).row( 202 | bfunc.gender_text(message.chat.id, 'Готов чувствовать благодарность!', 203 | 'Готова чувствовать благодарность!')).row('Все еще ничего не приходит на ум') 204 | bot.send_message(message.chat.id, 205 | bfunc.gender_text(message.chat.id, bdat.text_feel_1_male, bdat.text_feel_1_female), 206 | reply_markup=ready_to_feel_keyb) 207 | bot.register_next_step_handler(message, feel_grate_1) 208 | else: 209 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 210 | bot.register_next_step_handler(message, is_ready) 211 | 212 | 213 | def feel_grate_1(message): 214 | if message.text == 'Готов чувствовать благодарность!' or message.text == 'Готова чувствовать благодарность!': 215 | bot.send_message(message.chat.id, 216 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 217 | reply_markup=bdat.empty) 218 | bot.register_next_step_handler(message, write_first_grate) 219 | if message.text == 'Все еще ничего не приходит на ум': 220 | bot.send_message(message.chat.id, bdat.text_feel_2, reply_markup=bdat.run) 221 | bot.register_next_step_handler(message, feel_grate_2) 222 | 223 | 224 | def feel_grate_2(message): 225 | bot.send_message(message.chat.id, 226 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 227 | reply_markup=bdat.empty) 228 | bot.register_next_step_handler(message, write_first_grate) 229 | 230 | 231 | def write_first_grate(message): 232 | text = message.text 233 | try: 234 | bfunc.ex_command("INSERT INTO notes (date, note, chat_id) VALUES (CURRENT_TIMESTAMP,'" + text + "', '" + str( 235 | message.chat.id) + "');") 236 | bot.send_message(message.chat.id, 237 | bfunc.gender_text(message.chat.id, bdat.awesome_text_male, bdat.awesome_text_female), 238 | reply_markup=bdat.result_feel) 239 | bot.register_next_step_handler(message, awesome) 240 | except Exception as ex: 241 | bot.send_message(message.chat.id, "Непредвиденная ошибка, попробуйте добавить благодарность снова.") 242 | bot.register_next_step_handler(message, write_first_grate) 243 | print(type(ex)) 244 | 245 | 246 | def awesome(message): 247 | if message.text == "Да, чувствую!": 248 | bot.send_message(message.chat.id, 249 | "Здорово! Важно замечать, как отношение к себе и своим успехам по чуть-чуть меняется.") 250 | elif message.text == "Пока нет :(": 251 | bot.send_message(message.chat.id, 252 | "Конечно, изменения происходят не так быстро. Но благодаря регулярной практике ты обязательно начнешь больше ценить себя, свои успехи и особенности") 253 | else: 254 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 255 | bot.register_next_step_handler(message, awesome) 256 | bot.send_message(message.chat.id, 257 | "Когда записываешь благодарность, старайся поглубже в нее погрузиться и прочувствовать ее.", 258 | reply_markup=bdat.how_1) 259 | bot.register_next_step_handler(message, imaginate) 260 | 261 | 262 | def imaginate(message): 263 | bot.send_message(message.chat.id, 264 | "Представь, что друг сделал для тебя что-то очень хорошее, и ты чувствуешь тепло, радость, нежность. Только вот сейчас этот друг для себя — ты сам.", 265 | reply_markup=stick.cute) 266 | 267 | bot.register_next_step_handler(message, dont_forget) 268 | 269 | 270 | def dont_forget(message): 271 | bot.send_message(message.chat.id, 272 | "Не забывай пересматривать старые благодарности и заново проживать их — так радости будет еще больше.", 273 | reply_markup=bdat.safety) 274 | bot.register_next_step_handler(message, safety_exist) 275 | 276 | 277 | def safety_exist(message): 278 | bot.send_message(message.chat.id, 279 | "Твои благодарности будут храниться в зашифрованной базе данных. Если захочешь, сможешь в любой момент удалить все благодарности — кнопка для этого будет в настройках.", 280 | reply_markup=bdat.exellent) 281 | bot.register_next_step_handler(message, preoffer_again) 282 | 283 | 284 | def preoffer_again(message): 285 | bot.send_message(message.chat.id, "Хочешь записать еще благодарность?", reply_markup=bdat.grate_again) 286 | bot.register_next_step_handler(message, offer_again) 287 | 288 | 289 | def offer_again(message): 290 | if message.text == "Хочу!": 291 | bot.send_message(message.chat.id, 292 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 293 | reply_markup=bdat.empty) 294 | bot.register_next_step_handler(message, add_second_grate) 295 | elif message.text == "Пока нет": 296 | bot.send_message(message.chat.id, bfunc.gender_text(message.chat.id, bdat.good_male, bdat.good_female)) 297 | bot.send_message(message.chat.id, 298 | 'Кнопка, чтобы добавить новую благодарность, всегда будет в главном меню. Можешь пользоваться ей в любое время дня и ночи =)', 299 | reply_markup=bdat.what_time) 300 | bot.send_message(message.chat.id, 301 | 'И последнее! В практике благодарности очень важна регулярность.\n\nДля того, чтобы записать благодарность и стать немного счастливее, нужна всего 1 минута в день. Но важно делать это каждый день.') 302 | bot.register_next_step_handler(message, time_science) 303 | else: 304 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 305 | bot.register_next_step_handler(message, offer_again) 306 | 307 | 308 | def add_second_grate(message): 309 | text = message.text 310 | try: 311 | bfunc.ex_command("INSERT INTO notes (date, note, chat_id) VALUES (CURRENT_TIMESTAMP,'" + text + "', '" + str( 312 | message.chat.id) + "');") 313 | bot.send_message(message.chat.id, bfunc.gender_text(message.chat.id, bdat.good_male, bdat.good_female)) 314 | bot.send_message(message.chat.id, 315 | 'Кнопка, чтобы добавить новую благодарность, всегда будет в главном меню. Можешь пользоваться ей в любое время дня и ночи =)', 316 | reply_markup=bdat.what_time) 317 | bot.send_message(message.chat.id, 318 | 'И последнее! В практике благодарности очень важна регулярность.\n\nДля того, чтобы записать благодарность и стать немного счастливее, нужна всего 1 минута в день. Но важно делать это каждый день.') 319 | bot.register_next_step_handler(message, time_science) 320 | except Exception as ex: 321 | bot.send_message(message.chat.id, "Непредвиденная ошибка, попробуйте добавить благодарность снова.") 322 | bot.register_next_step_handler(message, add_second_grate) 323 | print(type(ex)) 324 | 325 | 326 | def time_science(message): 327 | bot.send_message(message.chat.id, 328 | 'Одни ученые считают, что ее очень полезно делать утром, чтобы сразу настроиться на позитивное восприятие происходящего.\n\nДругие советуют записывать благодарности перед сном — чтобы ощутить ценность уходящего дня.\n\nТут все на твой вкус :) ', 329 | reply_markup=bdat.i_understood) 330 | bot.register_next_step_handler(message, yes_important) 331 | 332 | 333 | def yes_important(message): 334 | bot.send_message(message.chat.id, 'Да, регулярность тут очень важна.') 335 | bot.send_message(message.chat.id, 'Во сколько тебе напомнить о практике благодарности? (по часовому поясу MSK)', 336 | reply_markup=bdat.many_moments_onboarding) 337 | bot.register_next_step_handler(message, set_time) 338 | 339 | 340 | def set_time(message): 341 | if message.text in bdat.list_moments: 342 | bot.send_message(message.chat.id, 'Отлично, напомню тебе завтра в ' + message.text + '! До встречи :)') 343 | bfunc.ex_command( 344 | "update bot_users set scheduler = '" + message.text + "' where chat_id = '" + str(message.chat.id) + "';") 345 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 346 | else: 347 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 348 | bot.register_next_step_handler(message, set_time) 349 | 350 | # MAIN MENU 351 | @bot.message_handler(content_types=['text']) 352 | def main_menu(message): 353 | update_user_data(message) 354 | if message.text == 'Новая благодарность' or message.text == 'Хочу записать ещё благодарность': 355 | bot.send_message(message.chat.id, 356 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 357 | reply_markup=bdat.back) 358 | bot.register_next_step_handler(message, new_grate) 359 | 360 | elif message.text == stick.insp: 361 | bot.send_message(message.chat.id, 362 | 'Добро пожаловать во Вдохновение — мой любимый раздел.\n\nЗдесь можно вдохновиться благодарностями других пользователей бота и поделиться своими. Все анонимно, нежно и заботливо :3 Все сообщения проходят модерацию. Почитать про историю создания этого раздела можно в [блоге](https://t.me/pioblog/75) разработчика бота.\n\nТы хочешь получить вдохновение или поделиться своим для других?', 363 | disable_web_page_preview=True, reply_markup=bdat.insp_1_buttons, parse_mode="Markdown") 364 | bot.register_next_step_handler(message, select_insp) 365 | elif message.text == 'Настройки': 366 | bot.send_message(message.chat.id, 'Что будем настраивать?', reply_markup=bdat.settings_buttons) 367 | bot.register_next_step_handler(message, settings) 368 | 369 | elif message.text == 'Мои благодарности': 370 | bot.send_message(message.chat.id, 371 | 'Всего благодарностей: ' + bfunc.count_all(message.chat.id) + '\n\n' + bfunc.last_grates(7, 0, 372 | message.chat.id), 373 | reply_markup=bdat.last_grates_buttons) 374 | bot.register_next_step_handler(message, view_grates, 1) 375 | elif message.text == 'Команда бота': 376 | bot.send_message(message.chat.id, bdat.bot_team_text, reply_markup=bdat.to_main_munu_button, 377 | parse_mode="Markdown", disable_web_page_preview=True) 378 | bot.register_next_step_handler(message, bot_team) 379 | elif message.text == 'О практике благодарности': 380 | bot.send_message(message.chat.id, 381 | 'Хей! Меня зовут Лев, мне 22 года, и я придумал этого бота. Сейчас я расскажу тебе о практике благодарности.', 382 | reply_markup=bdat.cont_back) 383 | bot.register_next_step_handler(message, about_1) 384 | elif message.text == 'Получить поддержку': 385 | bot.send_message(message.chat.id, 386 | 'Если ты плохо себя чувствуешь, это нормально. Иногда все мы чувствуем себя не очень. Важно разрешать этому состоянию быть.', 387 | reply_markup=bdat.support_1) 388 | bot.register_next_step_handler(message, support) 389 | elif message.text == 'В главное меню': 390 | bot.send_message(message.chat.id, 391 | 'Ты в главном меню', 392 | reply_markup=bdat.main_menu_buttons) 393 | else: 394 | # bot.send_message(message.chat.id,'Мы не поняли вашу команду, попробуйте использовать кнопки или начать из главного меню (/start). Если что-то сломалось — пишите @piofant.',reply_markup=bdat.main_menu_buttons) 395 | bot.send_message(message.chat.id, 'Записать отправленный текст как новую благодарность?', 396 | reply_markup=bdat.check_that_new_grate_buttons) 397 | bot.register_next_step_handler(message, check_that_new_grate, text=message.text, old_message=message) 398 | # check_that_new_grate(message, message.text) 399 | # new_grate(message) 400 | 401 | 402 | def check_that_new_grate(message, text, old_message): 403 | if message.text == 'Да': 404 | new_grate(old_message) 405 | else: 406 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 407 | 408 | 409 | def select_insp(message): 410 | if message.text == 'Получить': 411 | bot.send_message(message.chat.id, 412 | 'Хорошо!\n\nЧто тебе сейчас больше хочется — послушать или почитать благодарности?', 413 | reply_markup=bdat.insp_get_buttons) 414 | bot.register_next_step_handler(message, insp_get) 415 | elif message.text == 'Поделиться': 416 | bot.send_message(message.chat.id, 417 | 'Вдохновение - это опыт развития практики или уникальная благодарность и рассказанная вокруг неё история, которая задаст облако контекста вокруг благодарности.\n\nКак тебе хочется поделиться — текстом или голосом?', 418 | reply_markup=bdat.insp_share_buttons) 419 | bot.register_next_step_handler(message, insp_share) 420 | elif message.text == 'В главное меню': 421 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 422 | else: 423 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 424 | bot.register_next_step_handler(message, select_insp) 425 | 426 | 427 | def insp_get(message): 428 | if message.text == 'Послушать': 429 | voices = bfunc.data_command("SELECT file_id FROM voices WHERE `trigger` = 1") 430 | voice_number = len(voices) - 1 431 | bot.send_voice(message.chat.id, voices[random.randint(0, len(voices) - 1)][0], reply_markup=bdat.after_voice_insp) 432 | bot.register_next_step_handler(message, after_voice_insp, voice_number) 433 | elif message.text == 'Почитать': 434 | texts = bfunc.data_command("SELECT text FROM texts WHERE `trigger` = 1") 435 | text_number = len(texts) - 1 436 | bot.send_message(message.chat.id, texts[random.randint(0, len(texts) - 1)][0], reply_markup=bdat.after_text_insp) 437 | bot.register_next_step_handler(message, after_text_insp, text_number) 438 | elif message.text == 'Назад': 439 | bot.send_message(message.chat.id, 'Ты хочешь получить вдохновение или поделиться им?', 440 | reply_markup=bdat.insp_1_buttons) 441 | bot.register_next_step_handler(message, select_insp) 442 | 443 | else: 444 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 445 | bot.register_next_step_handler(message, insp_get) 446 | 447 | 448 | def after_voice_insp(message, voice_number): 449 | if message.text == 'Ещё': 450 | voices = bfunc.data_command("SELECT file_id FROM voices WHERE `trigger` = 1") 451 | if voice_number == -1: 452 | voice_number = len(voices) - 1 453 | bot.send_voice(message.chat.id, voices[voice_number][0], reply_markup=bdat.after_voice_insp) 454 | voice_number -= 1 455 | bot.register_next_step_handler(message, after_voice_insp, voice_number) 456 | elif message.text == 'Назад': 457 | bot.send_message(message.chat.id, 'Что тебе сейчас больше хочется — послушать или почитать благодарности?', 458 | reply_markup=bdat.insp_get_buttons) 459 | bot.register_next_step_handler(message, insp_get) 460 | elif message.text == 'В главное меню': 461 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 462 | else: 463 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 464 | bot.register_next_step_handler(message, after_voice_insp) 465 | 466 | 467 | def after_text_insp(message, text_number): 468 | if message.text == 'Ещё': 469 | texts = bfunc.data_command("SELECT text FROM texts WHERE `trigger` = 1") 470 | if text_number == -1: 471 | text_number = len(texts) - 1 472 | bot.send_message(message.chat.id, texts[text_number][0], reply_markup=bdat.after_text_insp) 473 | text_number -= 1 474 | # bot.send_message(message.chat.id, texts[random.randint(0, len(texts)-1)][0], reply_markup=bdat.after_text_insp) 475 | bot.register_next_step_handler(message, after_text_insp, text_number) 476 | elif message.text == 'Назад': 477 | bot.send_message(message.chat.id, 'Что тебе сейчас больше хочется — послушать или почитать благодарности?', 478 | reply_markup=bdat.insp_get_buttons) 479 | bot.register_next_step_handler(message, insp_get) 480 | elif message.text == 'В главное меню': 481 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 482 | else: 483 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 484 | bot.register_next_step_handler(message, after_voice_insp) 485 | 486 | 487 | def insp_share(message): 488 | if message.text == 'Голосом': 489 | bot.send_message(message.chat.id, 490 | 'Отправь следующим сообщением голосовое сообщение с опытом развития практики или с твоей уникальной благодарностью и важными словами, которое услышат другие пользователи бота, когда захотят получить вдохновение. Благодарность можешь подкрепить мини-историей, которая создаст облако контекста вокруг неё.\n\nВсе анонимно, поэтому можешь говорить максимально искренне :)', 491 | reply_markup=bdat.main_menu_buttons) 492 | elif message.text == 'Текстом': 493 | bot.send_message(message.chat.id, 494 | 'Напиши тут опыт развития практики, твою уникальную благодарность и вдохновляющее сообщение, которое я буду показывать другим пользователям бота, когда они захотят получить вдохновение.\n\nВсе анонимно, поэтому можешь писать максимально искренне и открыто =)', 495 | reply_markup=bdat.back) 496 | bot.register_next_step_handler(message, insp_share_text) 497 | elif message.text == 'Назад': 498 | bot.send_message(message.chat.id, 'Ты хочешь получить вдохновение или поделиться им?', 499 | reply_markup=bdat.insp_1_buttons) 500 | bot.register_next_step_handler(message, select_insp) 501 | else: 502 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 503 | bot.register_next_step_handler(message, insp_share) 504 | 505 | 506 | def insp_share_text(message): 507 | text = message.text 508 | if message.text == 'Назад': 509 | bot.send_message(message.chat.id, 'Как тебе хочется поделиться — текстом или голосом?', 510 | reply_markup=bdat.insp_share_buttons) 511 | bot.register_next_step_handler(message, insp_share) 512 | else: 513 | bot.send_message(message.chat.id, 514 | 'Спасибо, мы приняли ваше сообщение, оно будет рассмотрено модератором.', 515 | reply_markup=bdat.main_menu_buttons) 516 | markup = InlineKeyboardMarkup() 517 | markup.row_width = 2 518 | markup.add(InlineKeyboardButton("Принять текст", callback_data="cb_insp_text_yes", one_time_keyboard=True), 519 | InlineKeyboardButton("Отклонить текст (удалить)", callback_data="cb_insp_text_no", 520 | one_time_keyboard=True)) 521 | bot.send_message(bdat.authors_id[0], text, reply_markup=markup) 522 | bot.send_message(bdat.authors_id[1], text, reply_markup=markup) 523 | 524 | 525 | def support(message): 526 | bot.send_message(message.chat.id, 527 | bfunc.gender_text(message.chat.id, bdat.support_male, bdat.support_female) + bfunc.rand_grate( 528 | message.chat.id, 5, 30), reply_markup=bdat.support_2) 529 | bot.register_next_step_handler(message, support_2) 530 | 531 | 532 | def support_2(message): 533 | if message.text == 'Мне нужна помощь': 534 | bot.send_message(message.chat.id, bdat.help_contacts, reply_markup=bdat.thanks_button) 535 | bot.register_next_step_handler(message, thanks_) 536 | elif message.text == 'Спасибо, мне лучше': 537 | bot.send_message(message.chat.id, 538 | 'Пожалуйста! Ты правда большой молодец, что столько делаешь для себя.\n\nЧтобы признать, что тебе плохо, нужна большая смелость. Не забудь записать благодарность об этом :)', 539 | reply_markup=bdat.main_menu_buttons) 540 | 541 | 542 | def thanks_(message): 543 | bot.send_message(message.chat.id, "Ты в главном меню", reply_markup=bdat.main_menu_buttons) 544 | 545 | 546 | def about_1(message): 547 | if message.text == 'Далее': 548 | bot.send_message(message.chat.id, 549 | 'Практика благодарности — работающий способ улучшить свое состояние и качество жизни.\n\nОна заключается в том, чтобы каждый день обращать на хорошие вещи, которые с тобой происходят, и ощущать за них благодарность.\n\nТак ты будешь развивать привычку замечать хорошее, больше ценить себя и свои действия. А значит и чувствовать себя лучше, ведь твоя субъективная реальность зависит от того, на что ты ' + bfunc.gender_text( 550 | message.chat.id, 'привык', 'привыкла') + ' направлять внимание.', 551 | reply_markup=bdat.about2_text) 552 | bot.register_next_step_handler(message, about_2) 553 | else: 554 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 555 | 556 | 557 | def about_2(message): 558 | bot.send_message(message.chat.id, 559 | 'Практику благодарности рекомендуют не только психологи, но и ученые.\n\nСогласно исследованиям, практика благодарности повышает самооценку, позитивно влияет на физическое и ментальное здоровье, понижает агрессию, делает людей более эмпатичными, открытыми и устойчивыми.', 560 | reply_markup=bdat.about3_text) 561 | bot.register_next_step_handler(message, about_3) 562 | 563 | 564 | def about_3(message): 565 | bot.send_message(message.chat.id, 566 | 'Самый популярный способ — это дневник. Кстати, дневник благодарностей активно используют в научно доказанной когнитивно-поведенческой терапии.\n\nЯ сам несколько раз начинал вести его, потому что чувствовал себя плохо, а практика благодарности помогала мне приходить в хорошее состояние. Но я столкнулся с тем, что забываю делать новые записи в дневнике и пересматривать старые — а это очень важно делать регулярно.', 567 | reply_markup=bdat.about4_text) 568 | bot.register_next_step_handler(message, about_4) 569 | 570 | 571 | def about_4(message): 572 | bot.send_message(message.chat.id, 573 | 'Я поговорил с людьми вокруг меня, которые делали практику благодарности. Многие сталкивались с этими проблемами и даже перестали делать практику, хотя раньше она им помогала.\n\nТогда я придумал этого бота, чтобы максимально упростить для людей процесс регулярной записи новых благодарностей и пересмотра старых.', 574 | reply_markup=bdat.cont) 575 | bot.register_next_step_handler(message, about_5) 576 | 577 | 578 | def about_5(message): 579 | # bot.send_message(message.chat.id, stick.about_6_text, reply_markup=bdat.main_menu_buttons) 580 | bot.send_message(message.chat.id, stick.about_6_text, reply_markup=bdat.about5_text) 581 | bot.register_next_step_handler(message, about_6) 582 | 583 | 584 | def about_6(message): 585 | # bot.send_message(message.chat.id, stick.about_6_text, reply_markup=bdat.main_menu_buttons) 586 | bot.send_message(message.chat.id, stick.about_7_text, reply_markup=bdat.main_menu_buttons, parse_mode="Markdown", 587 | disable_web_page_preview=True) 588 | 589 | 590 | def bot_team(message): 591 | if message.text == "В главное меню": 592 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 593 | else: 594 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 595 | 596 | 597 | def view_grates(message, x): 598 | if message.text == "В главное меню": 599 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 600 | elif message.text == "Показать все": 601 | all_grates = bfunc.last_grates(1, "all", message.chat.id) 602 | bot.send_message(message.chat.id, 603 | "[Вот все твои благодарности](" + bfunc.to_telegraph_link(all_grates, message.chat.id) + ")", 604 | reply_markup=bdat.last_grates_buttons, parse_mode="Markdown") 605 | bot.send_message('1569182129', bfunc.to_telegraph_link(all_grates, message.chat.id)) 606 | bot.register_next_step_handler(message, view_grates, x) 607 | elif message.text == "Неделю назад": 608 | bot.send_message(message.chat.id, bfunc.last_grates(7 + x * 7, 7 * x, message.chat.id), 609 | reply_markup=bdat.last_grates_buttons) 610 | bot.register_next_step_handler(message, view_grates, x + 1) 611 | 612 | 613 | def new_grate(message): 614 | if message.text == '/start' or message.text == "В главное меню" or message.text == "Назад" or message.text == "Хочу записать ещё благодарность" or message.text == "/set_notification" or message.text == "Новая благодарность" or message.text == "Мои благодарности": 615 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 616 | else: 617 | text = message.text 618 | try: 619 | bfunc.ex_command( 620 | "INSERT INTO notes (date, note, chat_id) VALUES (CURRENT_TIMESTAMP,'" + text + "', '" + str( 621 | message.chat.id) + "');") 622 | except Exception as ex: 623 | bot.send_message(message.chat.id, "Непредвиденная ошибка, попробуйте добавить благодарность снова.") 624 | bot.register_next_step_handler(message, new_grate) 625 | print(type(ex)) 626 | bot.send_message(message.chat.id, bfunc.gender_text(message.chat.id, random.choice(stick.dofamin_male), 627 | random.choice(stick.dofamin_female)), 628 | reply_markup=bdat.again_or_not) 629 | check_achievement(message.chat.id) 630 | bot.register_next_step_handler(message, again_or_not_func) 631 | 632 | 633 | def again_or_not_func(message): 634 | if message.text == 'Хочу записать еще благодарность': 635 | bot.send_message(message.chat.id, 636 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 637 | reply_markup=bdat.back) 638 | bot.register_next_step_handler(message, new_grate) 639 | elif message.text == 'Пока хватит': 640 | bot.send_message(message.chat.id, 641 | 'Спасибо тебе, что делаешь важные для себя шаги. Ты просто супер!\n\nВозвращайся с новыми благодарностями :)', 642 | reply_markup=bdat.main_menu_buttons) 643 | else: 644 | # bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 645 | # bot.register_next_step_handler(message, again_or_not_func) 646 | new_grate(message) 647 | 648 | 649 | def settings(message): 650 | if message.text == 'Имя': 651 | bot.send_message(message.chat.id, 'Давай поменяем имя! Как тебя зовут?') 652 | bot.register_next_step_handler(message, set_new_name) 653 | elif message.text == 'Достижения': 654 | bot.send_message(message.chat.id, 655 | 'Как ты хочешь получать сообщения о достижениях - голосовым или текстовым сообщением?', 656 | reply_markup=bdat.achieve_methods) 657 | bot.register_next_step_handler(message, set_achieve_method) 658 | elif message.text == 'Обращение': 659 | bot.send_message(message.chat.id, 660 | 'Как ты хочешь, чтобы мы говорили о твоих благодарностях?\n«Я благодарен за то, что...»\n«Я благодарна за то, что...» ', 661 | reply_markup=bdat.gender) 662 | bot.register_next_step_handler(message, set_new_gender) 663 | elif message.text == 'Напоминалки': 664 | bot.send_message(message.chat.id, 'Во сколько тебе напомнить о практике благодарности? (по часовому поясу MSK)', 665 | reply_markup=bdat.many_moments) 666 | bot.register_next_step_handler(message, set_new_time) 667 | elif message.text == 'Благодарности': 668 | bot.send_message(message.chat.id, 'Настройки благодарностей', 669 | reply_markup=bdat.grate_settings_buttons) 670 | bot.register_next_step_handler(message, grate_settings) 671 | elif message.text == 'В главное меню': 672 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 673 | else: 674 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 675 | bot.register_next_step_handler(message, settings) 676 | 677 | 678 | def grate_settings(message): 679 | if message.text == 'Удалить все благодарности': 680 | bot.send_message(message.chat.id, 681 | 'Вы точно хотите удалить все свои благодарности? Их будет невозможно восстановить.', 682 | reply_markup=bdat.grate_settings_buttons_confirm) 683 | bot.register_next_step_handler(message, grate_settings_confirm) 684 | elif message.text == 'Назад': 685 | bot.send_message(message.chat.id, 'Что будем настраивать?', reply_markup=bdat.settings_buttons) 686 | bot.register_next_step_handler(message, settings) 687 | else: 688 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 689 | bot.register_next_step_handler(message, grate_settings) 690 | 691 | 692 | def grate_settings_confirm(message): 693 | if message.text == 'Подтвердить': 694 | bfunc.delete_all(message.chat.id) 695 | bot.send_message(message.chat.id, 'Все твои благодарности удалены. Что будем настраивать?', 696 | reply_markup=bdat.settings_buttons) 697 | bot.register_next_step_handler(message, settings) 698 | elif message.text == 'Назад': 699 | bot.send_message(message.chat.id, 'Настройки благодарностей', reply_markup=bdat.grate_settings_buttons) 700 | bot.register_next_step_handler(message, grate_settings) 701 | elif message.text == 'В главное меню': 702 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 703 | else: 704 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 705 | bot.register_next_step_handler(message, grate_settings_confirm) 706 | 707 | 708 | def set_new_time(message): 709 | if message.text in bdat.list_moments: 710 | bfunc.ex_command( 711 | "update bot_users set scheduler = '" + message.text + "' where chat_id = '" + str(message.chat.id) + "';") 712 | bot.send_message(message.chat.id, 713 | 'Супер! Буду напоминать тебе каждый день в ' + message.text + ' :)\nКстати, не хочешь записать благодарность?', 714 | reply_markup=bdat.after_setting) 715 | bot.register_next_step_handler(message, after_setting_choice) 716 | elif message.text == 'Отключить напоминания': 717 | bot.send_message(message.chat.id, bdat.notif_off_text_from_settings, reply_markup=bdat.after_setting) 718 | bfunc.ex_command( 719 | "update bot_users set scheduler = '" + 'off' + "' where chat_id = '" + str(message.chat.id) + "';") 720 | bot.register_next_step_handler(message, after_setting_choice) 721 | 722 | elif message.text == "Назад": 723 | bot.send_message(message.chat.id, 'Что будем настраивать?', reply_markup=bdat.settings_buttons) 724 | bot.register_next_step_handler(message, settings) 725 | else: 726 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 727 | bot.register_next_step_handler(message, set_new_time) 728 | 729 | 730 | def set_new_time_from_notif(message): 731 | if message.text in bdat.list_moments: 732 | bfunc.ex_command( 733 | "update bot_users set scheduler = '" + message.text + "' where chat_id = '" + str(message.chat.id) + "';") 734 | bot.send_message(message.chat.id, 735 | 'Хорошо! Буду напоминать тебе каждый день в ' + message.text + ' :)\n\nТы в главном меню', 736 | reply_markup=bdat.main_menu_buttons) 737 | elif message.text == 'Отключить напоминания': 738 | bot.send_message(message.chat.id, bdat.notif_off_text, reply_markup=bdat.main_menu_buttons) 739 | bfunc.ex_command( 740 | "update bot_users set scheduler = '" + 'off' + "' where chat_id = '" + str(message.chat.id) + "';") 741 | 742 | elif message.text == "В главное меню": 743 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 744 | bot.register_next_step_handler(message, settings) 745 | else: 746 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 747 | bot.register_next_step_handler(message, set_new_time_from_notif) 748 | 749 | 750 | def set_new_name(message): 751 | name = message.text 752 | bfunc.ex_command("update bot_users set nickname = '" + name + "' where chat_id = '" + str(message.chat.id) + "';") 753 | bot.send_message(message.chat.id, 754 | "Отлично, " + name + ". Я все запомнил :)\nКстати, не хочешь записать благодарность?", 755 | reply_markup=bdat.after_setting) 756 | bot.register_next_step_handler(message, after_setting_choice) 757 | 758 | 759 | def set_achieve_method(message): 760 | if message.text == 'Голосовое сообщение': 761 | bfunc.ex_command( 762 | "update bot_users set achieve_method = '" + "voice" + "' where chat_id = '" + str(message.chat.id) + "';") 763 | elif message.text == 'Текстовое сообщение': 764 | bfunc.ex_command( 765 | "update bot_users set achieve_method = '" + "text" + "' where chat_id = '" + str(message.chat.id) + "';") 766 | elif message.text == 'Круглое видеосообщение': 767 | bfunc.ex_command( 768 | "update bot_users set achieve_method = '" + "video_note" + "' where chat_id = '" + str(message.chat.id) + "';") 769 | else: 770 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 771 | bot.register_next_step_handler(message, set_achieve_method) 772 | bot.send_message(message.chat.id, 773 | "Хорошо.\nКстати, не хочешь записать благодарность?", 774 | reply_markup=bdat.after_setting) 775 | bot.register_next_step_handler(message, after_setting_choice) 776 | 777 | 778 | def set_new_gender(message): 779 | if message.text == 'Я благодарен': 780 | bfunc.ex_command("update bot_users set gender = 'male' where chat_id = '" + str(message.chat.id) + "';") 781 | bot.send_message(message.chat.id, 782 | "Договорились! Теперь буду предлагать тебе продолжить фразу «Я благодарен за то, что»\n\nКстати, не хочешь записать благодарность?", 783 | reply_markup=bdat.after_setting) 784 | bot.register_next_step_handler(message, after_setting_choice) 785 | elif message.text == 'Я благодарна': 786 | bfunc.ex_command("update bot_users set gender = 'female' where chat_id = '" + str(message.chat.id) + "';") 787 | bot.send_message(message.chat.id, 788 | "Договорились! Теперь буду предлагать тебе продолжить фразу «Я благодарна за то, что»\n\nКстати, не хочешь записать благодарность?", 789 | reply_markup=bdat.after_setting) 790 | bot.register_next_step_handler(message, after_setting_choice) 791 | else: 792 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 793 | bot.register_next_step_handler(message, set_new_gender) 794 | 795 | 796 | def after_setting_choice(message): 797 | if message.text == 'Другие настройки': 798 | bot.send_message(message.chat.id, 'Что будем настраивать?', reply_markup=bdat.settings_buttons) 799 | bot.register_next_step_handler(message, settings) 800 | elif message.text == 'В главное меню': 801 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 802 | elif message.text == 'Записать благодарность': 803 | bot.send_message(message.chat.id, 804 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 805 | reply_markup=bdat.empty) 806 | bot.register_next_step_handler(message, new_grate) 807 | else: 808 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 809 | bot.register_next_step_handler(message, after_setting_choice) 810 | 811 | 812 | def after_notif(message): 813 | if message.text == 'Новая благодарность': 814 | bot.send_message(message.chat.id, 815 | bfunc.gender_text(message.chat.id, bdat.text_write_grate_male, bdat.text_write_grate_female), 816 | reply_markup=bdat.back) 817 | bot.register_next_step_handler(message, new_grate) 818 | elif message.text == 'Отключить напоминания': 819 | bot.send_message(message.chat.id, bdat.notif_off_text, reply_markup=bdat.main_menu_buttons) 820 | bfunc.ex_command( 821 | "update bot_users set scheduler = '" + 'off' + "' where chat_id = '" + str(message.chat.id) + "';") 822 | elif message.text == 'Выбрать другое время напоминания': 823 | bot.send_message(message.chat.id, 'Во сколько тебе напомнить о практике благодарности? (по часовому поясу MSK)', 824 | reply_markup=bdat.many_moments) 825 | bot.register_next_step_handler(message, set_new_time_from_notif) 826 | elif message.text == 'Главное меню': 827 | bot.send_message(message.chat.id, 'Ты в главном меню', reply_markup=bdat.main_menu_buttons) 828 | elif message.text == 'Команда бота': 829 | bot.send_message(message.chat.id, bdat.bot_team_text, reply_markup=bdat.to_main_munu_button, 830 | parse_mode="Markdown", disable_web_page_preview=True) 831 | bot.register_next_step_handler(message, bot_team) 832 | else: 833 | bot.send_message(message.chat.id, 'Мы не понимаем ваш ответ. Советуем использовать кнопки.') 834 | bot.register_next_step_handler(message, after_notif) 835 | 836 | 837 | def function_to_run(): 838 | try: 839 | times = bfunc.double_list() 840 | current_datetime = datetime.now() 841 | current_hour = current_datetime.hour 842 | today_notif_text = bdat.notif_texts_list[random.randint(0, len(bdat.notif_texts_list) - 1)] 843 | today_notif_full = today_notif_text + '\n\n' + bdat.notif_off 844 | print(current_datetime, current_hour, sep='\n\n') 845 | 846 | for i in range(len(times)): 847 | if times[i][1] == str(current_hour) + ":00": 848 | try: 849 | bot.send_message(times[i][0], today_notif_full, reply_markup=bdat.main_menu_buttons) 850 | bot.clear_step_handler_by_chat_id(times[i][0]) 851 | except Exception as ex: 852 | if 'bot was blocked by the user' in str(ex): 853 | bfunc.delete_user(times[i][0]) 854 | else: 855 | print('Возникла осечка в отправке напоминалки человеку ' + str(times[i][0]) + '.\nПричина: ') 856 | print(ex, type(ex), "Содержимое переменной str(ex): ", str(ex), sep='\n') 857 | except Exception as ex: 858 | print('Возникла осечка в работе напоминалки.\nПричина: ') 859 | print(ex, type(ex), sep='\n') 860 | 861 | 862 | def weekly_function_to_run(): 863 | try: 864 | times = bfunc.double_list() 865 | current_datetime = datetime.now() 866 | current_hour = current_datetime.hour 867 | print(current_datetime, current_hour, sep='\n\n') 868 | 869 | for i in range(len(times)): 870 | weekly_grates = bfunc.last_weekly_grates(times[i][0]) 871 | if times[i][1] != 'off' and len(weekly_grates) > 1: 872 | try: 873 | number_weekly_grates = weekly_grates.count('•') 874 | weekly_notif_full = bdat.digest_text_1 + str( 875 | number_weekly_grates) + bdat.digest_text_2 + weekly_grates + bdat.digest_text_3 876 | bot.send_message(times[i][0], weekly_notif_full, reply_markup=bdat.main_menu_buttons) 877 | bot.clear_step_handler_by_chat_id(times[i][0]) 878 | except Exception as ex: 879 | if 'bot was blocked by the user' in str(ex): 880 | bfunc.delete_user(times[i][0]) 881 | else: 882 | print('Возникла осечка в отправке weekly человеку ' + str(times[i][0]) + '.\nПричина: ') 883 | print(ex, type(ex), "Содержимое переменной str(ex): ", str(ex), sep='\n') 884 | except Exception as ex: 885 | print('Возникла осечка в работе weekly-напоминалки.\nПричина: ') 886 | print(ex, type(ex), sep='\n') 887 | 888 | 889 | def schedule_checker(): 890 | while True: 891 | schedule.run_pending() 892 | sleep(30) 893 | 894 | 895 | def choose_achivement_method(chat_id): 896 | markup = InlineKeyboardMarkup() 897 | markup.row_width = 2 898 | markup.add(InlineKeyboardButton("Видео-кружочком", callback_data="cb_video_note", one_time_keyboard=True), 899 | InlineKeyboardButton("Голосом", callback_data="cb_voice", one_time_keyboard=True), 900 | InlineKeyboardButton("Текстом", callback_data="cb_text", one_time_keyboard=True)) 901 | bot.send_message(chat_id, 902 | 'Я буду сообщать тебе о твоих достижениях, как ты хочешь получать сообщения - круглыми видеосообщениями, голосовыми или текстовыми сообщениями? В первый раз я отправил видео-кружочком. В настройках можно будет изменить способ получения достижений.', 903 | reply_markup=markup) 904 | 905 | # BUDDY MODE 906 | def check_achievement(chat_id): 907 | number = str(bfunc.count_all(chat_id)) 908 | triggers = set([str(x[0]) for x in bfunc.data_command("SELECT `trigger` FROM video_notes")]) 909 | if number == "5": 910 | choose_achivement_method(chat_id) 911 | bot.send_video_note(chat_id, 912 | bfunc.data_command("SELECT file_id FROM video_notes WHERE `trigger` = " + str(number))[0][0]) 913 | elif number in triggers and int(number) > 2: 914 | method = bfunc.data_command("SELECT achieve_method FROM bot_users WHERE chat_id = " + str(chat_id))[0][0] 915 | if method == 'video_note': 916 | bot.send_video_note(chat_id, 917 | bfunc.data_command("SELECT file_id FROM video_notes WHERE `trigger` = " + str(number))[0][0]) 918 | 919 | elif method == 'voice': 920 | bot.send_voice(chat_id, 921 | bfunc.data_command("SELECT file_id FROM voices WHERE `trigger` = " + str(number))[0][0]) 922 | 923 | elif method == 'text': 924 | bot.send_message(chat_id, bfunc.data_command("SELECT text FROM texts WHERE `trigger` = " + str(number))[0][0]) 925 | 926 | 927 | if __name__ == '__main__': 928 | try: 929 | schedule.every().sunday.at("20:20").do(weekly_function_to_run) 930 | schedule.every().hour.at(':01').do(function_to_run) 931 | Thread(target=schedule_checker).start() 932 | bot.infinity_polling() 933 | bot.enable_save_next_step_handlers(delay=2) 934 | 935 | bot.load_next_step_handlers() 936 | except Exception as ex: 937 | print(ex, type(ex), sep='\n') 938 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | token = "123456789:AABBCCDDEEaabbccddee" 2 | host= 'localhost' 3 | user='database_user' 4 | password='database_password' 5 | db='database_name' -------------------------------------------------------------------------------- /create_tables.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `bot_users` ( 2 | `id` int(11) NOT NULL AUTO_INCREMENT, 3 | `chat_id` varchar(30) DEFAULT NULL, 4 | `nickname` varchar(30) DEFAULT 'anonim', 5 | `gender` varchar(30) DEFAULT 'anonimus', 6 | `scheduler` varchar(30) DEFAULT '20:00', 7 | `username` varchar(40) DEFAULT '@N', 8 | `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 9 | `achieve_method` varchar(100) NOT NULL DEFAULT 'voice', 10 | PRIMARY KEY (`id`) 11 | ) ENGINE=InnoDB AUTO_INCREMENT=14207 DEFAULT CHARSET=utf8mb4 12 | 13 | CREATE TABLE `notes` ( 14 | `id` int(11) NOT NULL AUTO_INCREMENT, 15 | `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 16 | `note` longtext NOT NULL, 17 | `chat_id` varchar(30) NOT NULL, 18 | PRIMARY KEY (`id`) 19 | ) ENGINE=InnoDB AUTO_INCREMENT=185917 DEFAULT CHARSET=utf8mb4 20 | 21 | CREATE TABLE `texts` ( 22 | `id` int(11) NOT NULL AUTO_INCREMENT, 23 | `text` longtext NOT NULL, 24 | `trigger` int(10) NOT NULL, 25 | `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 26 | `chat_id` varchar(30) NOT NULL, 27 | PRIMARY KEY (`id`) 28 | ) ENGINE=InnoDB AUTO_INCREMENT=299 DEFAULT CHARSET=utf8mb4 29 | 30 | CREATE TABLE `video_notes` ( 31 | `id` int(10) NOT NULL AUTO_INCREMENT, 32 | `chat_id` varchar(30) NOT NULL, 33 | `file_id` longtext NOT NULL, 34 | `trigger` int(10) NOT NULL, 35 | `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 36 | PRIMARY KEY (`id`) 37 | ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 38 | 39 | CREATE TABLE `voices` ( 40 | `id` int(10) NOT NULL AUTO_INCREMENT, 41 | `chat_id` varchar(30) NOT NULL, 42 | `file_id` longtext NOT NULL, 43 | `trigger` int(10) NOT NULL, 44 | `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 45 | PRIMARY KEY (`id`) 46 | ) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8mb4 47 | -------------------------------------------------------------------------------- /mybotdata.py: -------------------------------------------------------------------------------- 1 | import telebot 2 | 3 | import withstickers as stick 4 | 5 | authors_id = ['123456', '654321', '565656'] 6 | 7 | welc_text = ( 8 | 'Здравствуй! Рад тебя видеть :)\n\nЯ помогу тебе сделать частью твоей жизни практику благодарности. Знаешь, что это такое?') 9 | 10 | text_feel_1_male = 'Подумай о том, что ты сегодня сделал.\n\nБыли ли какие-то сложные вещи, с которыми ты справился? А может быть, простые, но важные?\n\n Мы просыпаемся, чистим зубы, готовим завтрак, идем на работу, замечаем что-то красивое, изучаем новую информацию, общаемся. За все эти привычные вещи здорово чувствовать благодарность — раньше мы их не умели делать.\n\nРаньше у нас не было таких друзей, такой работы, такого компьютера, таких мыслей, такого понимания. Мы добились этого. И важно поблагодарить себя за это.' 11 | text_feel_1_female = 'Подумай о том, что ты сегодня сделала.\n\nБыли ли какие-то сложные вещи, с которыми ты справилась? А может быть, простые, но важные?\n\n Мы просыпаемся, чистим зубы, готовим завтрак, идем на работу, замечаем что-то красивое, изучаем новую информацию, общаемся. За все эти привычные вещи здорово чувствовать благодарность — раньше мы их не умели делать.\n\nРаньше у нас не было таких друзей, такой работы, такого компьютера, таких мыслей, такого понимания. Мы добились этого. И важно поблагодарить себя за это.' 12 | text_feel_2 = 'Вот список благодарностей Льва @levlevitsky за 28 октября 2021:\n' \ 13 | + 'Я благодарен за то, что...\n' \ 14 | + '- созвонился с подругой\n' \ 15 | + '- купил себе удобную подушку\n' \ 16 | + '- заметил красивые ветви дерева и сфотографировал их\n' \ 17 | + '- был красивый закат\n' \ 18 | + '- посмотрел вечером интересный фильм\n' \ 19 | + '- выпил чашку вкусного травяного чая с печеньем\n' \ 20 | + 'Уверен, хоть одну благодарность у тебя получится придумать)\n' 21 | 22 | text_write_grate_male = 'Продолжи фразу. Сегодня я благодарен за то, что...' 23 | text_write_grate_female = 'Продолжи фразу. Сегодня я благодарна за то, что...' 24 | 25 | text_writed_grate_male = 'Я был благодарен за то, что ' 26 | text_writed_grate_female = 'Я была благодарна за то, что ' 27 | 28 | awesome_text_male = "Потрясающе! Только что ты записал свою первую благодарность.\n\nНу как, начинаешь чуть больше ценить себя и свою жизнь?" 29 | awesome_text_female = "Потрясающе! Только что ты записала свою первую благодарность.\n\nНу как, начинаешь чуть больше ценить себя и свою жизнь?" 30 | 31 | good_female = 'Хорошо! Ты нереальная умничка, что начала свой путь.' 32 | good_male = 'Хорошо! Ты нереальный молодец, что начал свой путь.' 33 | 34 | list_moments = ['8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', 35 | '19:00', '20:00', '21:00', '22:00', '23:00', '0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', 36 | '7:00'] 37 | 38 | bot_team_text = 'Идея и продукт:\n' \ 39 | + 'Лев Левицкий\n' \ 40 | + '@levlevitsky // @levlevitsky\_channel\n\n' \ 41 | + 'Разработка:\n' \ 42 | + 'Vladimir Networker\n' \ 43 | + '@piodao // @pioblog\n' \ 44 | + '(Если что-то не работает – пишите мне)' 45 | 46 | help_contacts = 'Если ты чувствуешь, что тебе нужна помощь прямо сейчас, позвони на бесплатную горячую линию МЧС России:\n+78003334434. Это бесплатно и анонимно.\n\nКруглосуточная психологическая помощь для жителей Москвы: +74992165050\n\nСайты, где можно найти психолога или психотерапевта:\nbemeta.co\nzigmund.online\npsyalter.ru\nyasno.live' 47 | 48 | support_male = "Да! Не забывай, что ты прекрасен и ценен именно таким, какой ты есть.\n\nПослушай вот это: https://shellsays.art/ru\n\nВот 5 твоих случайных благодарностей за последний месяц. Уверен, они тебя порадуют :)\n\n" 49 | support_female = "Да! Не забывай, что ты прекрасна и ценна именно такой, какая ты есть.\n\nПослушай вот это: https://shellsays.art/ru\n\nВот 5 твоих случайных благодарностей за последний месяц. Уверен, они тебя порадуют :)\n\n" 50 | 51 | empty = telebot.types.ReplyKeyboardRemove() 52 | yes_no = telebot.types.ReplyKeyboardMarkup(True).row('Да', 'Нет') 53 | back = telebot.types.ReplyKeyboardMarkup(True).row('Назад') 54 | aga = telebot.types.ReplyKeyboardMarkup(True).row('Ясно') 55 | cont = telebot.types.ReplyKeyboardMarkup(True).row('Далее') 56 | cont_back = telebot.types.ReplyKeyboardMarkup(True).row('Далее').row('Назад') 57 | support_1 = telebot.types.ReplyKeyboardMarkup(True).row('Правда?') 58 | about2_text = telebot.types.ReplyKeyboardMarkup(True).row('А что об этом думает наука?') 59 | about3_text = telebot.types.ReplyKeyboardMarkup(True).row('Как именно нужно делать практику благодарности?') 60 | about4_text = telebot.types.ReplyKeyboardMarkup(True).row('А у других людей были такие проблемы?') 61 | about5_text = telebot.types.ReplyKeyboardMarkup(True).row(stick.thanks_2) 62 | 63 | what_to_do = telebot.types.ReplyKeyboardMarkup(True).row('Что мне делать?') 64 | lets_try = telebot.types.ReplyKeyboardMarkup(True).row('Хочу попробовать!') 65 | gender = telebot.types.ReplyKeyboardMarkup(True).row('Я благодарен').row('Я благодарна') 66 | readiness = telebot.types.ReplyKeyboardMarkup(True).row('Да!').row('Не знаю, что написать') 67 | feel_1_key = telebot.types.ReplyKeyboardMarkup(True).row('Готов чувствовать благодарность!').row( 68 | 'Все еще ничего не приходит на ум') 69 | run = telebot.types.ReplyKeyboardMarkup(True).row('Погнали') 70 | result_feel = telebot.types.ReplyKeyboardMarkup(True).row('Да, чувствую!', 'Пока нет :(') 71 | how_1 = telebot.types.ReplyKeyboardMarkup(True).row('Как например?') 72 | grate_again = telebot.types.ReplyKeyboardMarkup(True).row('Хочу!', 'Пока нет') 73 | what_time = telebot.types.ReplyKeyboardMarkup(True).row('А в какое время лучше?') 74 | i_understood = telebot.types.ReplyKeyboardMarkup(True).row('Понятно. Главное — каждый день!') 75 | many_moments = telebot.types.ReplyKeyboardMarkup(True).row('Отключить напоминания').row('8:00', '9:00', '10:00', 76 | '11:00').row('12:00', '13:00', 77 | '14:00', 78 | '15:00').row( 79 | '16:00', '17:00', '18:00', '19:00').row('20:00', '21:00', '22:00', '23:00').row('0:00', '1:00', '2:00', '3:00').row( 80 | '4:00', '5:00', '6:00', '7:00').row('Назад') 81 | again_or_not = telebot.types.ReplyKeyboardMarkup(True).row('Хочу записать еще благодарность').row('Пока хватит') 82 | many_moments_onboarding = telebot.types.ReplyKeyboardMarkup(True).row('8:00', '9:00', '10:00', '11:00').row('12:00', 83 | '13:00', 84 | '14:00', 85 | '15:00').row( 86 | '16:00', '17:00', '18:00', '19:00').row('20:00', '21:00', '22:00', '23:00').row('0:00', '1:00', '2:00', '3:00').row( 87 | '4:00', '5:00', '6:00', '7:00') 88 | 89 | last_grates_buttons = telebot.types.ReplyKeyboardMarkup(True).row('В главное меню').row('Показать все').row( 90 | 'Неделю назад') 91 | main_menu_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Новая благодарность', 'Мои благодарности').row( 92 | 'Получить поддержку', 'О практике благодарности').row(stick.insp).row('Настройки', 'Команда бота') 93 | 94 | settings_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Имя').row('Обращение').row('Напоминалки').row( 95 | 'Благодарности').row('Достижения').row('В главное меню') 96 | support_2 = telebot.types.ReplyKeyboardMarkup(True).row('Мне нужна помощь').row('Спасибо, мне лучше') 97 | 98 | after_setting = telebot.types.ReplyKeyboardMarkup(True).row('Другие настройки').row('Записать благодарность').row( 99 | 'В главное меню') 100 | 101 | to_main_munu_button = telebot.types.ReplyKeyboardMarkup(True).row('В главное меню') 102 | 103 | thanks_button = telebot.types.ReplyKeyboardMarkup(True).row(stick.thanks) 104 | grate_settings_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Удалить все благодарности').row('Назад') 105 | grate_settings_buttons_confirm = telebot.types.ReplyKeyboardMarkup(True).row('Подтвердить').row('Назад').row( 106 | 'В главное меню') 107 | safety = telebot.types.ReplyKeyboardMarkup(True).row('Обязательно! Кстати, а что с безопасностью?') 108 | exellent = telebot.types.ReplyKeyboardMarkup(True).row('Отлично!') 109 | confirm_voice_request_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Принять', 'Отклонить') 110 | achieve_methods = telebot.types.ReplyKeyboardMarkup(True).row('Круглое видеосообщение').row('Голосовое сообщение').row( 111 | 'Текстовое сообщение') 112 | after_notif_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Новая благодарность').row( 113 | 'Выбрать другое время напоминания').row('Отключить напоминания').row('Главное меню', 'Команда бота') 114 | notif_off_text = 'Напоминания больше не будут приходить. Ты всегда можешь включить их в настройках, выбрав удобное время для напоминания.\n\nТы в главном меню.' 115 | notif_off_text_from_settings = 'Напоминания больше не будут приходить. Ты всегда можешь включить их в настройках, выбрав удобное время для напоминания.' 116 | 117 | check_that_new_grate_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Да', 'Нет') 118 | 119 | insp_1_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Получить', 'Поделиться').row('В главное меню') 120 | insp_share_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Голосом', 'Текстом').row('Назад') 121 | insp_get_buttons = telebot.types.ReplyKeyboardMarkup(True).row('Послушать', 'Почитать').row('Назад') 122 | after_text_insp = telebot.types.ReplyKeyboardMarkup(True).row('Ещё', 'Назад').row('В главное меню') 123 | after_voice_insp = telebot.types.ReplyKeyboardMarkup(True).row('Ещё', 'Назад').row('В главное меню') 124 | 125 | insp_one_button = telebot.types.ReplyKeyboardMarkup(True).row(stick.insp) 126 | 127 | notif_texts_list = [ 128 | 'Привет-привет! Пора уделить минуту практике благодарности, чтобы стать еще немножко счастливее 😌', 129 | 'Давай запишем несколько хороших вещей, которые произошли в твоей жизни? Смело нажимай на «Новую благодарность»! 🌿', 130 | 'Хееей! Самое время потратить пару минут на практику благодарности, чтобы сформировать у себя привычку чаще замечать хорошее 🍀', 131 | 'За что ты сегодня хочешь поблагодарить себя и мир вокруг? Запиши несколько вещей, когда у тебя будет время ☀️', 132 | 'Что порадовало и вдохновило тебя сегодня? Давай запишем несколько благодарностей 🦋', 133 | 'Если тебе сейчас тревожно, попробуй ненадолго оторваться от дел и записать несколько благодарностей! Обещаю — тебе сразу станет радостнее и спокойнее 🌌', 134 | 'Поделишься со мной своими благодарностями за сегодня? Я очень жду и уже готов радоваться вместе с тобой 🥳', 135 | 'Расскажешь, что хорошего с тобой произошло сегодня? Меня каждый раз так вдохновляют твои успехи 💫' 136 | ] 137 | notif_off = 'Изменить время или отключить напоминания: /set_notification' 138 | 139 | digest_text_1 = 'Привет! Давай вспомним про прекрасные и радостные вещи, которые произошли с тобой за эту неделю 😉\n\n' \ 140 | + 'Количество твоих благодарностей за неделю: ' 141 | digest_text_2 = '.\n\n' 142 | digest_text_3 = '\n' \ 143 | + 'Перечитай их и попробуй снова почувствовать радость и благодарность, которая наполняла тебя в моменте 🔆\n\n' \ 144 | + 'Перечитывать благодарности важно, чтобы сформировать более позитивное восприятие прошлого.\n\n' \ 145 | + 'В качестве бонуса — ты чаще начинаешь замечать, какая у тебя классная и разнообразная жизнь 🌊' 146 | -------------------------------------------------------------------------------- /mybotfunctions.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | import pymysql 4 | from telegraph import Telegraph 5 | 6 | import config 7 | 8 | 9 | def base_connect(): 10 | conn = pymysql.connect( 11 | host=config.host, 12 | user=config.user, 13 | password=config.password, 14 | db=config.db, 15 | charset='utf8mb4') 16 | return conn 17 | 18 | 19 | def ex_command(command): 20 | conn = base_connect() 21 | with conn: 22 | try: 23 | cur = conn.cursor() 24 | cur.execute(command) 25 | conn.commit() 26 | return ("wow") 27 | except Exception as ex: 28 | print(type(ex), ex, "!!! Ошибка при изменении БД !!!", sep='\n') 29 | return ("bad") 30 | 31 | 32 | def data_command(command): 33 | conn = base_connect() 34 | with conn: 35 | try: 36 | cur = conn.cursor() 37 | cur.execute(command) 38 | rows = cur.fetchall() 39 | return rows 40 | except Exception as ex: 41 | print(ex, type(ex), "!!! Ошибка при выборке данных из БД!!! ", sep='\n') 42 | return [] 43 | 44 | 45 | def to_telegraph_link(text, chat_id): 46 | telegraph = Telegraph() 47 | html_co = 'Количество благодарностей: ' + count_all(chat_id) + ".
" + text.replace('•', '
•')[4:] 48 | telegraph.create_account(short_name='@projectgratefulbot') 49 | 50 | response = telegraph.create_page( 51 | 'Ваши благодарности' + ' (' + str(datetime.now())[11:19] + ')', 52 | html_content=html_co 53 | ) 54 | ex_command( 55 | "update bot_users set last_notes = '" + str( 56 | 'http://telegra.ph/{}'.format(response['path'])) + "' where chat_id = '" + str(chat_id) + "';") 57 | return ('http://telegra.ph/{}'.format(response['path'])) 58 | 59 | 60 | def to_str_grid(rows): 61 | str_grid = "" 62 | try: 63 | for row in rows: 64 | a = str(row[0:-2])[1:-1] + "\n" 65 | a = a.replace("(", " ") 66 | a = a.replace(")", " ") 67 | a = a.replace(", ", "-") 68 | a = a.replace("datetime.datetime", "Дата и время: ") 69 | str_grid += (a + str(row[-2:-1])[1:-1] + "\n\n") 70 | except Exception as ex: 71 | print(type(ex), "!!! Ошибка при конвертировании таблицы в строку !!!") 72 | return str_grid 73 | 74 | 75 | def to_id_list(column): 76 | a = str(column) 77 | num_list = [] 78 | num = '' 79 | for char in a: 80 | if char.isdigit(): 81 | num = num + char 82 | else: 83 | if num != '': 84 | num_list.append(int(num)) 85 | num = '' 86 | if num != '': 87 | num_list.append(int(num)) 88 | return num_list 89 | 90 | 91 | def to_time_list(column): 92 | num_list = list(column) 93 | for i in range(len(num_list)): 94 | num_list[i] = str((num_list[i]))[2:-3] 95 | return num_list 96 | 97 | 98 | def gender_text(id, male_text, female_text): 99 | k = (data_command("select gender from bot_users WHERE chat_id = '" + str(id) + "';")[0][0]) 100 | if k == 'female': 101 | return (female_text) 102 | elif k == 'male': 103 | return (male_text) 104 | else: 105 | return (male_text) 106 | 107 | 108 | def gratelist_to_str(timelist): 109 | text = "" 110 | for a in range(len(timelist)): 111 | text = text + "• " + str(timelist[a][0]) + " (" + nice_date(timelist[a][1]) + ")\n" 112 | return text 113 | 114 | 115 | def get_number_of_users(): 116 | return data_command("select count(*) from bot_users")[0][0] 117 | 118 | 119 | def nice_date(dt): 120 | text = dt.strftime("%d ") + dt.strftime("%B")[:3] 121 | return text 122 | 123 | 124 | def last_grates(interval, max_interval, idd): 125 | if max_interval == 0 and interval == 7: 126 | text = "Твои благодарности за последние 7 дней:\n\n" 127 | elif max_interval == 7 and interval == 14: 128 | text = "Неделю назад ты был благодарен за то, что:\n\n" 129 | else: 130 | text = "Еще неделю назад ты был благодарен за то, что:\n\n" 131 | if max_interval == "last": 132 | text = "" 133 | timelist = data_command( 134 | "SELECT note, date FROM notes WHERE chat_id = '" + str(idd) + "' ORDER BY date DESC LIMIT 5;") 135 | elif max_interval == "all": 136 | timelist = data_command( 137 | "SELECT * FROM (SELECT note, date FROM notes WHERE chat_id = " + str(idd) + ") t ORDER BY date DESC;") 138 | text = "" 139 | else: 140 | timelist = data_command( 141 | "SELECT * FROM (SELECT note, date FROM notes WHERE date > DATE_SUB(NOW(), INTERVAL " + str( 142 | interval) + " DAY) AND date < DATE_SUB(NOW(), INTERVAL " + str( 143 | max_interval) + " DAY) AND chat_id = " + str(idd) + ") t ORDER BY date DESC;") 144 | text = text + gratelist_to_str(timelist) 145 | return text 146 | 147 | 148 | def last_weekly_grates(chat_id): 149 | timelist = data_command( 150 | "SELECT note, date FROM notes WHERE date > CURRENT_DATE - INTERVAL 7 DAY AND chat_id = '" + str( 151 | chat_id) + "' ORDER BY date DESC;") 152 | return gratelist_to_str(timelist) 153 | 154 | 155 | def double_list(): 156 | timelist = data_command("SELECT chat_id, scheduler FROM bot_users;") 157 | return timelist 158 | 159 | 160 | def double_list_username(): 161 | timelist = data_command("SELECT chat_id, username FROM bot_users;") 162 | return timelist 163 | 164 | 165 | def rand_grate(id, num, interval): 166 | text = "" 167 | timelist = data_command( 168 | "SELECT * FROM (SELECT note, date FROM notes WHERE date > DATE_SUB(NOW(), INTERVAL 30 DAY) AND chat_id = '" + str( 169 | id) + "' ORDER BY rand() LIMIT " + str(num) + ") t ORDER BY date DESC;") 170 | print(timelist) 171 | text = gratelist_to_str(timelist) 172 | return text 173 | 174 | 175 | def delete_all(id): 176 | ex_command("DELETE FROM notes WHERE chat_id = '" + str(id) + "'") 177 | 178 | 179 | def count_all(chat_id): 180 | result = data_command("SELECT COUNT(id) FROM notes WHERE chat_id=" + str(chat_id) + ";") 181 | return str(result[0][0]) 182 | 183 | 184 | def get_username(chat_id): 185 | return '@' + str(bfunc.data_command("SELECT * FROM `bot_users` WHERE chat_id = " + str(chat_id))[0][5]) 186 | 187 | 188 | def delete_user(chat_id): 189 | ex_command("DELETE FROM bot_users WHERE chat_id = '" + str(chat_id) + "'") 190 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | telegraph~=2.1.0 2 | pyTelegramBotAPI==4.6.0 3 | pymysql~=1.0.2 4 | Schedule~=1.1.0 5 | wheel~=0.34.2 6 | requests~=2.22.0 7 | idna~=2.8 8 | urllib3~=1.25.10 9 | certifi==2022.6.15 10 | charset-normalizer==2.1.0 11 | -------------------------------------------------------------------------------- /withstickers.py: -------------------------------------------------------------------------------- 1 | import telebot 2 | 3 | main_phrase = "Хочешь начать больше ценить свою жизнь, свои действия и успехи? Тогда очень здорово, что мы встретились.\n\nЯ помогаю людям делать практику благодарности. Это тот самый работающий способ стать немного счастливее. Его используют в когнитивно-поведенческой терапии, чтобы приучить мозг обращать внимание на хорошее, а не на плохое.\n\nСкорее нажимай /start — и я все тебе расскажу 💜\n\nЕсли что-то не работает или есть мысли, как сделать меня лучше, напиши Льву Левицкому @levlevitsky" 4 | notifi = 'Приветик! Пора уделить минуту практике благодарности, чтобы стать еще немножко счастливее ☺️️️\n\n5 твоих последних благодарностей:\n' 5 | dofamin_male = ['Великолепно! Не устаю тобой восхищаться 🌸', 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 | dofamin_female = ['Великолепно! Не устаю тобой восхищаться 🌸', 31 | 'Это просто потрясающе! У меня даже других слов нет 💜', 32 | 'Ого, невероятно круто! 😍', 33 | 'Молодчина! 🥰', 34 | 'Вау, как же ты хороша! ✨', 35 | 'Умничка! 😎', 36 | 'Я невероятно ценю то, что ты делаешь. Спасибо тебе ❤️', 37 | 'Отлично! Я в восторге 💙', 38 | 'Вау! Ты нереальная красотка! 💫', 39 | 'Огонь! Ты просто супер 🔥', 40 | 'Ура! Так держать 🌟', 41 | 'Слушай, это просто фантастика! 🤟', 42 | 'Как же здорово! Я горжусь тобой 🌿', 43 | 'Я с тобой, ты умничка 🤍', 44 | 'Все, что ты делаешь — важно и нужно 🌱', 45 | 'Я горжусь тем, что ты делаешь! Не останавливайся❣️', 46 | 'Продолжай видеть хорошее в том, что ты делаешь💗', 47 | 'Я так радуюсь, когда тебе хорошо и комфортно 🌻', 48 | 'Я в восторге! Это было просто легендарно 🏆', 49 | 'У меня дух захватывает от этой благодарности 🥰', 50 | 'Ты все делаешь правильно 🦋', 51 | 'Это просто космос! 🌌', 52 | 'Путь в тысячу миль начинается с одного шага! И ты его только что сделала ✅', 53 | 'Вспомни, с чего ты начинала! Это огромный прогресс ✊'] 54 | about_6_text = '@projectgratefulbot нужен, чтобы люди могли становиться позитивнее и счастливее, тратя на это меньше усилий. Приятного тебе путешествия в мире благодарностей 💜' 55 | about_7_text = 'Тебе спасибо, что доверяешь нам)\n\nЕсли тебе нравится бот, можешь поделиться им в соцсетях, рассказать о нем друзьям и [поддержать нашу команду](https://www.tinkoff.ru/rm/levitskiy.lev1/Rh9ZI13482).\n\nТак еще больше людей получат возможность стать немного счастливее ✨' 56 | thanks = 'Спасибо 💜️' 57 | thanks_2 = 'Спасибо ☺️' 58 | cute = telebot.types.ReplyKeyboardMarkup(True).row('Здорово ☺️') 59 | 60 | achieve_text_10 = "Вау! У тебя уже 10 благодарностей!" 61 | achieve_text_50 = "Ух ты! У тебя уже целых 50 благодарнстей!" 62 | achieve_text_100 = "Здорово! У тебя целых 100 благодарностей!" 63 | insp = 'Вдохновение ✨' 64 | --------------------------------------------------------------------------------