def update(self, proto, msg=None, *args, **kwargs): if isinstance(msg, Message) and msg.is_valid(): sender = getattr(msg, settings.SENDER, None) mes_ecrypted = base64.b64decode(str(msg)) decrypted_message = proto.decrypter.decrypt(mes_ecrypted) Chat.create_msg(msg, text=decrypted_message.decode('utf8')) proto.notify(f'new_{self.name}', msg) logger.info(f'Получено сообщение от пользователя {sender}')
def update_chat_db(message): with db_session: chat = Chat.get(chat_id=message.chat.id) if chat == None: chat = Chat(chat_id=message.chat.id, user_id=message.from_user.id, open_date=datetime.now(), \ last_message_date=datetime.now(), username=message.from_user.username, \ first_name=message.from_user.first_name, last_name=message.from_user.last_name, \ silent_mode=False, deleted=False) else: chat.last_message_date = datetime.now() chat.username = message.from_user.username if message.text == STOP_CMD: chat.silent_mode = True elif message.left_chat_participant != None: if message.left_chat_participant.id == BOT_ID: chat.deleted = True elif message.new_chat_participant != None: if message.new_chat_participant.id == BOT_ID: chat.deleted = False elif message.text == START_CMD: chat.silent_mode = False chat.deleted = False return chat.primary_id
def update(self, proto, msg=None, *args, **kwargs): code = getattr(msg, settings.RESPONSE, '') if code == 202: Chat.chats_merge(getattr(msg, settings.LIST_INFO, [])) proto.notify(f'done_{self.name}') else: proto.write( Message( **{ settings.ACTION: settings.GET_CHATS, settings.USER: settings.USER_NAME, })) proto.notify(f'send_{self.name}')
def fill_chat(self): with db_lock: messages = Chat.chat_hiltory(self.current_chat, settings.MAX_MESSAGE_IN_CHAT) user = self.current_user style_mes_out = self.get_template_out_mes() style_mes_in = self.get_template_in_mes() self.clear_chat() mes_list = [] with db_lock: for message in messages: if message.sender.username == user.username: style_mes = style_mes_out color = settings.COLOR_MESSAGE_OUT type_msg = self.type_msg_out else: style_mes = style_mes_in color = settings.COLOR_MESSAGE_IN type_msg = self.type_msg_in mes_list.append({ type_msg: style_mes(color=color, text=self.escape(message.text), created=message.created, user_name=message.sender.username), }) self.set_text_to_chat(mes_list)
def get_chats_keyboard(page: int): chats = Chat.select().order_by(Chat.id).page(page) keyboard = [] for chat in chats: if chat.is_subscribed(): data = 'chats_unsubscribe_{}_{}'.format(chat.chat_id, page) text = '🔔 {}' else: data = 'chats_subscribe_{}_{}'.format(chat.chat_id, page) text = '🔕 {}' keyboard.append([InlineKeyboardButton(text.format(chat.name), callback_data=data)]) footer = [] if page > 1: footer.append(InlineKeyboardButton( BTN_PREV_PAGE, callback_data='chats_{}'.format(page - 1))) footer.append(InlineKeyboardButton( MENU_RETURN, callback_data='admin_return')) if count(c for c in Chat) > page * 10: footer.append(InlineKeyboardButton( BTN_NEXT_PAGE, callback_data='chats_{}'.format(page + 1))) keyboard.append(footer) return keyboard
def send_message(bot, message): with db_session: cmd = text = '' primary_id = 0 params = message.text.split(' ', 2) if len(params) > 0: cmd = params[0] if len(params) > 1: try: primary_id = int(params[1]) except ValueError: bot.sendMessage(chat_id=message.chat_id, text='cannot find user') return False if len(params) > 2: text = params[2] if primary_id == 0: bot.sendMessage(chat_id=message.chat_id, text='cannot send message to empty user') elif len(text) == 0: bot.sendMessage(chat_id=message.chat_id, text='cannot send empty message') else: chat = Chat.get(primary_id=primary_id) if chat == None: bot.sendMessage(chat_id=message.chat_id, text='cannot find user') elif chat.deleted: bot.sendMessage(chat_id=message.chat_id, text='this user marked as deleted') else: bot.sendMessage(chat_id=chat.chat_id, text=text)
def set_active(self, current_chat=None): """Выбор активного пользователя.""" chat_name = current_chat or self.get_current_chat() if not self.current_user: self.current_user = self.get_current_user() if not chat_name: return user = User.by_name(chat_name) chat = Chat.filter_by(name=chat_name).first() or next((c for c in user.get_chats() if c.is_personal), None) obj = user or chat self.chat_members = chat.members self.current_chat = chat.name self.set_current_chat(chat) self.set_view_obj(obj) client = self.get_client() for cm in self.chat_members: if self.current_user == cm: continue client.notify(settings.PUBLIC_KEY_REQUEST, contact=cm.username) self.make_encryptor() if obj: self.fill_chat() if obj.avatar: self.set_ava(obj.avatar) else: self.clear_ava()
def result(text_button, instance): current_user = User.by_name(settings.USER_NAME) text = str(instance.text_field.text) if instance.text_field.text: chat = Chat.filter_by(name=text).first() if chat: toast('Ошибка Создание чата\nТакая группа уже существует') return with db_lock: chat = Chat.create(name=text, owner=current_user, is_personal=False) chat.members.append(current_user) chat.save() cg = self.get_screen('create_group') cg.instance_chat = chat print('set chat', cg.instance_chat) self.show_screen('create_group') toast(instance.text_field.text)
def send_message(self, extra=None): """Отправка сообщения.""" text = extra or self.get_msg_text() if not self.current_chat or not text: return if not self.encryptors: self.set_active() time.sleep(1) if not self.encryptors: logger.warn(f'Нет ключа для этого чата {self.current_chat}') self.critical('Нет ключа для этого чата') return client = self.get_client() for username, encryptor in self.encryptors.items(): mes_crypted = encryptor.encrypt(text.encode('utf8')) message = self.make_message(username, base64.b64encode(mes_crypted).decode('ascii')) client.notify(f'send_{settings.MESSAGE}', msg=message) Chat.create_msg(message, text=text) self.clear_msg_text() self.fill_chat()
def update_chat_db(message): with db_session: chat = Chat.get(chat_id=message.chat.id) if chat == None: chat = Chat(chat_id=message.chat.id, user_id=message.from_user.id, open_date=datetime.now(), \ last_message_date=datetime.now(), username=message.from_user.username, \ first_name=message.from_user.first_name, last_name=message.from_user.last_name, \ silent_mode=False, deleted=False, group_id="nobody", state="REGISTER_STATE", \ realname="") else: chat.last_message_date = datetime.now() chat.username = message.from_user.username chat.first_name = message.from_user.first_name chat.last_name = message.from_user.last_name return chat
def on_request(update: Update, context: CallbackContext): message = update.message command = message.text log.debug(f'Command: {command!r}') finish_time = parse_command(command) if not finish_time: message.reply_text('Не получилось разобрать команду!') return Reminder.create( message_id=message.message_id, command=command, finish_time=finish_time, user=User.get_from(update.effective_user), chat=Chat.get_from(update.effective_chat), ) message.reply_text(f'Напоминание установлено на {get_pretty_datetime(finish_time)}')
def update_chat_db(message): with db_session: chat = Chat.get(chat_id=message.chat.id) if chat == None: chat = Chat(chat_id=message.chat.id, user_id=message.from_user.id, open_date=datetime.now(), \ last_message_date=datetime.now(), username=message.from_user.username, \ first_name=message.from_user.first_name, last_name=message.from_user.last_name, \ silent_mode=False, deleted=False, group_id="nobody", state="REGISTER_STATE", \ realname="", contacts="", places="1", masterskaya="", gender="male") else: chat.last_message_date = datetime.now() chat.username = message.from_user.username chat.first_name = message.from_user.first_name chat.last_name = message.from_user.last_name return chat
def get_subscribed_chats() -> list: return [c.chat_id for c in Chat.select(lambda s: s.is_subscribed())]
def unsubscribe_chat(chat_id: int) -> None: Chat.get(chat_id=chat_id).subscribed = False
def subscribe_chat(chat_id: int) -> None: Chat.get(chat_id=chat_id).subscribed = True
def run(bot, logfile, slackbot): global LAST_UPDATE_ID for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): message = update.message chat = update_chat_db(message) primary_id, group_id, state, silent_mode, deleted, realname, news = \ chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, chat.realname, chat.news log_update(update, logfile, slackbot, primary_id) #automata_step(message, chat) reply_markup = MAIN_KEYBOARD_ADMIN if ( (group_id == "admin") or (group_id == 'teacher')) else MAIN_KEYBOARD print(u"State: {}. Message: {}".format(state, message.text)) if state.startswith("REGISTER_STATE"): if len(state.split()) == 1: reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true, "one_time_keyboard" : true}}'.format( CONFIRM_CMD) realname = u"{} {}".format(message.from_user.first_name, message.from_user.last_name) text = u'Ваше имя и фамилия в Телеграме: {}. Подтвердите его (нажмите или наберите "{}") или введите Вашe имя и фамилию для использования в этом боте:'.format( realname, CONFIRM_CMD) bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE password" elif len(state.split()) == 2: if message.text != CONFIRM_CMD: realname = message.text bot.sendMessage(chat_id=message.chat_id, text=u"Ваше имя: {}".format(realname), reply_markup=telegram.ReplyKeyboardHide()) #bot.sendMessage(chat_id=message.chat_id, text=REGISTER_TEXT) #state = "REGISTER_STATE password realname" bot.sendMessage(chat_id=message.chat_id, text=u'Вы в группе 1! Выберите команду:', reply_markup=reply_markup) state = "MAIN_STATE" elif len(state.split()) == 3: password = message.text if password == "umbrella": group_id = "group1" bot.sendMessage(chat_id=message.chat_id, text="Спасибо, вы в группе 1!", reply_markup=MAIN_KEYBOARD) state = "MAIN_STATE" elif password == "butterfly": group_id = "group2" bot.sendMessage(chat_id=message.chat_id, text="Спасибо, вы в группе 2!", reply_markup=MAIN_KEYBOARD) state = "MAIN_STATE" elif password == "god": group_id = "teacher" bot.sendMessage(chat_id=message.chat_id, text="Вы учитель!", reply_markup=MAIN_KEYBOARD_ADMIN) state = "MAIN_STATE" elif password == "boss": group_id = "admin" bot.sendMessage(chat_id=message.chat_id, text="Вы администратор!", reply_markup=MAIN_KEYBOARD_ADMIN) state = "MAIN_STATE" else: bot.sendMessage(chat_id=message.chat_id, text="Кодовое слово мне неизвестно :(") bot.sendMessage(chat_id=message.chat_id, text=REGISTER_TEXT) elif state == "MAIN_STATE": if message.left_chat_member != None: if message.left_chat_member.id == bot.getMe().id: deleted = True elif message.new_chat_member != None: if message.new_chat_member.id == bot.getMe().id: deleted = False elif message.text == HELP_CMD: bot.sendMessage(chat_id=message.chat_id, \ text=HELP_ADMIN_TEXT if ((group_id == "admin") or (group_id == 'teacher')) else HELP_TEXT) bot.sendMessage(chat_id=message.chat_id, text=HELP_MORE_TEXT) # elif message.text == START_CMD: # silent_mode = False # deleted = False # bot.sendMessage(chat_id=message.chat_id, text=MESSAGE_START, reply_markup=reply_markup) # elif message.text == STOP_CMD: # silent_mode = True # bot.sendMessage(chat_id=message.chat_id, text=MESSAGE_STOP, reply_markup=reply_markup) elif message.text == GROUP_CHAT_CMD: if group_id == 'group1': bot.sendMessage(chat_id=message.chat_id, text=GROUP1_CHAT_LINK, reply_markup=reply_markup) elif group_id == 'group2': bot.sendMessage(chat_id=message.chat_id, text=GROUP2_CHAT_LINK, reply_markup=reply_markup) elif group_id == 'admin' or group_id == 'teacher': bot.sendMessage(chat_id=message.chat_id, text=GROUP1_CHAT_LINK, reply_markup=reply_markup) bot.sendMessage(chat_id=message.chat_id, text=GROUP2_CHAT_LINK, reply_markup=reply_markup) elif message.text == ADMIN_PASS: bot.sendMessage(chat_id=message.chat_id, text=u'Вы администратор!', reply_markup=MAIN_KEYBOARD_ADMIN) group_id = 'admin' elif message.text == NEWS_CMD: #news_message = get_news_message() if news == '': bot.sendMessage(chat_id=message.chat_id, text=u"Пока никаких новостей...", reply_markup=reply_markup) else: from_chat_id, message_id = map(int, news.split()) try: bot.forwardMessage(chat_id=message.chat_id, from_chat_id=from_chat_id, message_id=message_id) except telegram.TelegramError as error: print "TelegramError", error elif message.text == TEACHER_CMD: bot.sendMessage(chat_id=message.chat_id, text=TEACHER_TEXT, reply_markup=reply_markup) elif message.text == HOMEWORK_CMD: bot.sendMessage(chat_id=message.chat_id, text=HOMEWORK_TEXT, reply_markup=reply_markup) elif message.text == RESULTS_CMD: bot.sendMessage(chat_id=message.chat_id, text=RESULTS_TEXT, reply_markup=reply_markup) elif message.text == CARD_CMD: bot.sendMessage( chat_id=message.chat_id, text= u'Номер карты: 4276 5500 6960 1089, получатель: Климовская Динара Омирхановна. Сбербанк.\nПожалуйста, скиньте скрин платежа Яне (@yasaukova), как отправите перевод)', reply_markup=reply_markup) elif message.text == CHINESE_POD_CMD: bot.sendMessage( chat_id=message.chat_id, text= u'Доступ к Chinese Pod:\nlogin - [email protected]\npassword - lagou', reply_markup=reply_markup) elif message.text == STUFF_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Выберите материал:', reply_markup=reply_markup) state = 'STUFF_STATE' elif message.text == SCHEDULE_CMD: #bot.sendMessage(chat_id=message.chat_id, text="Расписание не установлено", reply_markup=reply_markup) #if group_id == "group1": # bot.sendMessage(chat_id=message.chat_id, text="Расписание не установлено", reply_markup=reply_markup) #elif group_id == "group2": # bot.sendMessage(chat_id=message.chat_id, text="Среда, с 19:30 до 20:00", reply_markup=reply_markup) #else: # schedule_message = get_schedule_message() # bot.sendMessage(chat_id=message.chat_id, text=schedule_message, reply_markup=reply_markup) schedule_message = get_schedule_message() bot.sendMessage(chat_id=message.chat_id, text=schedule_message, reply_markup=reply_markup) elif (group_id == "admin" or group_id == "teacher") and message.text == SEND_CMD: state = "SEND_STATE" reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format( NEWS_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Отослать новость?", reply_markup=reply_markup) elif ((group_id == "admin") or (group_id == 'teacher')) and message.text == USER_LIST_CMD: print_userlist(bot, message) elif ( (group_id == "admin") or (group_id == 'teacher')) and message.text == GOOGLE_SHEET_CMD: bot.sendMessage( chat_id=message.chat_id, text=u'Ссылка на гуглшит: {}'.format(GOOGLE_SHEET), reply_markup=reply_markup) else: pass elif state.startswith("SEND_STATE"): if message.text == CANCEL_CMD: bot.sendMessage(chat_id=message.chat_id, text=u"Рассылка отменена", reply_markup=reply_markup) state = "MAIN_STATE" elif len(state.split()) == 1: if message.text == NEWS_CMD: state += " news" reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format( GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) elif message.text == HOMEWORK_CMD: state += " homework" reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format( GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) else: reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format( NEWS_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Отослать новость', reply_markup=reply_markup) elif len(state.split()) == 2: if message.text == GROUP1_CMD: state += " group1" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format( CANCEL_CMD) bot.sendMessage( chat_id=message.chat_id, text= u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) elif message.text == GROUP2_CMD: state += " group2" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format( CANCEL_CMD) bot.sendMessage( chat_id=message.chat_id, text= u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) elif message.text == ALL_CMD: state += " all" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format( CANCEL_CMD) bot.sendMessage( chat_id=message.chat_id, text= u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) else: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format( GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) elif len(state.split()) == 3: state += " " + str(message.message_id) reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format( CONFIRM_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Подтвердите отправку:", reply_markup=reply_markup) elif len(state.split()) == 4: if message.text == CONFIRM_CMD: _, _, group, message_id = state.split() forward_broad(bot, from_chat_id=message.chat_id, message_id=message_id, group=group) # Update news after broadcasting with db_session: chat = Chat.get(chat_id=message.chat.id) news = chat.news bot.sendMessage(chat_id=message.chat_id, text=u"Отправлено!", reply_markup=reply_markup) state = "MAIN_STATE" else: reply_markup = u'{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}'.format( CONFIRM_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text="Подтвердите отправку:", reply_markup=reply_markup) elif state.startswith('STUFF_STATE'): if message.text == STUFF_PIMSLER_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage( chat_id=message.chat_id, text=u'Пимслер -- https://yadi.sk/d/7E_5aVZLt5Nwf', reply_markup=reply_markup) elif message.text == STUFF_VIDEO_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage( chat_id=message.chat_id, text= u'Видео: \n https://yadi.sk/d/UZQt40fKtDLpW -- уровень 1\n https://yadi.sk/d/NvR0AXDhsM7iK -- уровень 2', reply_markup=reply_markup) elif message.text == STUFF_RESOURCES_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage( chat_id=message.chat_id, text= u'Ресурсы для обучения: busuu.com. Крутые приложения: memsrise, pleco, trainchinese', reply_markup=reply_markup) elif message.text == STUFF_BOOK_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage( chat_id=message.chat_id, text= u'Книга по ключам (https://vk.com/doc326978802_437453577?hash=0a34fc79dbdf96e3b8&dl=09475a5fd4ad299d57)', reply_markup=reply_markup) elif message.text == BACK_CMD: #reply_markup = MAIN_KEYBOARD_ADMIN if ((group_id == "admin") or (group_id == 'teacher')) else MAIN_KEYBOARD bot.sendMessage(chat_id=message.chat_id, text=u'Выберите команду:', reply_markup=reply_markup) state = 'MAIN_STATE' with db_session: chat = Chat.get(chat_id=message.chat.id) chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, chat.realname, chat.news = \ primary_id, group_id, state, silent_mode, deleted, realname, news LAST_UPDATE_ID = update.update_id + 1
def create_chat(body): community_id = body.get("community_id") chat = Chat(community_id=body.get("community_id")) db.session.add(chat) db.session.commit() return chat.serialize()
def run(bot, logfile): global LAST_UPDATE_ID for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): message = update.message chat = update_chat_db(message) primary_id, group_id, state, silent_mode, deleted, realname, contacts, username, places, gender, masterskaya = \ chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, \ chat.realname, chat.contacts, chat.username, chat.places, chat.gender, chat.masterskaya log_update(update, logfile) #automata_step(message, chat) #if group_id == "admin": # reply_markup = '{"keyboard" : [["/user_list"]], "resize_keyboard" : true, "one_time_keyboard" : true}' #else: # reply_markup = telegram.ReplyKeyboardHide() print(u"State: {}. Message: {}".format(state, message.text)) if state.startswith("REGISTER_STATE"): if len(state.split()) == 1: text = u"Привет! Вы попали в бот, распределяющий людей по палаткам." bot.sendMessage(chat_id=message.chat_id, text=text) if not username: reply_markup = '{"keyboard" : [["/continue"]], "resize_keyboard" : true, "one_time_keyboard" : true}' text = u"Пожалуйста, установите username в настройках (Settings) Телеграма, чтобы остальные могли с Вами связаться" bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) else: reply_markup = '{"keyboard" : [["/continue"]], "resize_keyboard" : true, "one_time_keyboard" : true}' text = u"По username @{} с Вами могут связываться остальные. Введите свой телефон для связи или нажмите /continue:".format(username) bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE contacts" elif len(state.split()) == 2: if message.text != "/continue": contacts = message.text text = u"Вы готовы предоставить место в палатке (/give) или Вам оно нужно (/need)?" reply_markup = '{"keyboard" : [["/give", "/need"]], "resize_keyboard" : true, "one_time_keyboard" : true}' bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE contacts group" elif len(state.split()) == 3: if message.text == "/give": state = "REGISTER_STATE contacts group give" group_id = "give" text = u"Сколько мест в палатке Вы можете предоставить?" reply_markup = '{"keyboard" : [["1", "2", "3"]], "resize_keyboard" : true, "one_time_keyboard" : true}' bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) elif message.text == "/need": state = "REGISTER_STATE contacts group need" group_id = "need" text = u"Из какой Вы мастерской?" bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=telegram.ReplyKeyboardHide()) else: pass elif state.split()[3] == "give": if len(state.split()) == 4: places = message.text reply_markup = '{"keyboard" : [["/female", "/male"]], "resize_keyboard" : true}' text = u'Введите Ваш пол ("/female", "/male"):' bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE contacts group give gender" elif len(state.split()) == 5: if message.text == "/male": gender = "male" elif message.text == "/female": gender = "female" else: gender = message.text reply_markup = '{"keyboard" : [["/register", "/unregister"]], "resize_keyboard" : true}' text = u"Ваша заявка зарегистрирована! Нажмите /register для перерегистрации или /unregister, если Ваша больше не актуальна." bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "MAIN_STATE" elif state.split()[3] == "need": if len(state.split()) == 4: masterskaya = message.text reply_markup = '{"keyboard" : [["/female", "/male"]], "resize_keyboard" : true}' text = u'Введите Ваш пол ("/female", "/male"):' bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE contacts group need gender" elif len(state.split()) == 5: if message.text == "/male": gender = "male" elif message.text == "/female": gender = "female" else: gender = message.text reply_markup = '{"keyboard" : [["/register", "/unregister"]], "resize_keyboard" : true}' text = u"Ваша заявка зарегистрирована! Нажмите /register для перерегистрации или /unregister, если Ваша больше не актуальна." bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "MAIN_STATE" elif state.startswith("MAIN_STATE"): if message.text == "I am god": group_id += "_admin" reply_markup = '{"keyboard" : [["/user_list", "/register", "/unregister"]], "resize_keyboard" : true}' bot.sendMessage(chat_id=message.chat_id, text="Вы админ! Вам доступен /user_list", reply_markup=reply_markup) elif message.left_chat_member != None: if message.left_chat_member.id == BOT_ID: deleted = True elif message.new_chat_member != None: if message.new_chat_member.id == BOT_ID: deleted = False elif message.text == "/unregister": if "admin" in group_id: group_id = "admin" else: group_id = "done" reply_markup = '{"keyboard" : [["/register"]], "resize_keyboard" : true}' text = u"Ваша заявка больше не актуальна! Нажмите /register для новой регистрации." bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) elif message.text == "/register": reply_markup = '{"keyboard" : [["/continue"]], "resize_keyboard" : true, "one_time_keyboard" : true}' text = u"По username @{} с Вами могут связываться остальные. Введите свой телефон для связи или нажмите /continue:".format(username) bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE contacts" elif message.text == USER_LIST_CMD: print_userlist(bot, message) elif "admin" in group_id and message.text == "/killme": exit() else: pass with db_session: chat = Chat.get(chat_id=message.chat.id) chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, \ chat.realname, chat.contacts, chat.username, chat.places, chat.gender, chat.masterskaya = \ primary_id, group_id, state, silent_mode, deleted, realname, contacts, username, places, gender, masterskaya LAST_UPDATE_ID = update.update_id + 1
def add_chat(_bot: Bot, update: Update) -> None: chat_id = update.effective_chat.id if not Chat.exists(chat_id=chat_id): Chat(chat_id=chat_id, name=update.effective_chat.title) Chat.get(chat_id=chat_id).name = update.effective_chat.title
def run(bot, logfile, slackbot): global LAST_UPDATE_ID for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): message = update.message chat = update_chat_db(message) primary_id, group_id, state, silent_mode, deleted, realname, news = \ chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, chat.realname, chat.news log_update(update, logfile, slackbot, primary_id) #automata_step(message, chat) reply_markup = MAIN_KEYBOARD_ADMIN if ((group_id == "admin") or (group_id == 'teacher')) else MAIN_KEYBOARD print(u"State: {}. Message: {}".format(state, message.text)) if state.startswith("REGISTER_STATE"): if len(state.split()) == 1: reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true, "one_time_keyboard" : true}}'.format(CONFIRM_CMD) realname = u"{} {}".format(message.from_user.first_name, message.from_user.last_name) text = u'Ваше имя и фамилия в Телеграме: {}. Подтвердите его (нажмите или наберите "{}") или введите Вашe имя и фамилию для использования в этом боте:'.format(realname, CONFIRM_CMD) bot.sendMessage(chat_id=message.chat_id, text=text, reply_markup=reply_markup) state = "REGISTER_STATE password" elif len(state.split()) == 2: if message.text != CONFIRM_CMD: realname = message.text bot.sendMessage(chat_id=message.chat_id, text=u"Ваше имя: {}".format(realname), reply_markup=telegram.ReplyKeyboardHide()) #bot.sendMessage(chat_id=message.chat_id, text=REGISTER_TEXT) #state = "REGISTER_STATE password realname" bot.sendMessage(chat_id=message.chat_id, text=u'Вы в группе 1! Выберите команду:', reply_markup=reply_markup) state = "MAIN_STATE" elif len(state.split()) == 3: password = message.text if password == "umbrella": group_id = "group1" bot.sendMessage(chat_id=message.chat_id, text="Спасибо, вы в группе 1!", reply_markup=MAIN_KEYBOARD) state = "MAIN_STATE" elif password == "butterfly": group_id = "group2" bot.sendMessage(chat_id=message.chat_id, text="Спасибо, вы в группе 2!", reply_markup=MAIN_KEYBOARD) state = "MAIN_STATE" elif password == "god": group_id = "teacher" bot.sendMessage(chat_id=message.chat_id, text="Вы учитель!", reply_markup=MAIN_KEYBOARD_ADMIN) state = "MAIN_STATE" elif password == "boss": group_id = "admin" bot.sendMessage(chat_id=message.chat_id, text="Вы администратор!", reply_markup=MAIN_KEYBOARD_ADMIN) state = "MAIN_STATE" else: bot.sendMessage(chat_id=message.chat_id, text="Кодовое слово мне неизвестно :(") bot.sendMessage(chat_id=message.chat_id, text=REGISTER_TEXT) elif state == "MAIN_STATE": if message.left_chat_member != None: if message.left_chat_member.id == bot.getMe().id: deleted = True elif message.new_chat_member != None: if message.new_chat_member.id == bot.getMe().id: deleted = False elif message.text == HELP_CMD: bot.sendMessage(chat_id=message.chat_id, \ text=HELP_ADMIN_TEXT if ((group_id == "admin") or (group_id == 'teacher')) else HELP_TEXT) bot.sendMessage(chat_id=message.chat_id, text=HELP_MORE_TEXT) # elif message.text == START_CMD: # silent_mode = False # deleted = False # bot.sendMessage(chat_id=message.chat_id, text=MESSAGE_START, reply_markup=reply_markup) # elif message.text == STOP_CMD: # silent_mode = True # bot.sendMessage(chat_id=message.chat_id, text=MESSAGE_STOP, reply_markup=reply_markup) elif message.text == GROUP_CHAT_CMD: if group_id == 'group1': bot.sendMessage(chat_id=message.chat_id, text=GROUP1_CHAT_LINK, reply_markup=reply_markup) elif group_id == 'group2': bot.sendMessage(chat_id=message.chat_id, text=GROUP2_CHAT_LINK, reply_markup=reply_markup) elif group_id == 'admin' or group_id == 'teacher': bot.sendMessage(chat_id=message.chat_id, text=GROUP1_CHAT_LINK, reply_markup=reply_markup) bot.sendMessage(chat_id=message.chat_id, text=GROUP2_CHAT_LINK, reply_markup=reply_markup) elif message.text == ADMIN_PASS: bot.sendMessage(chat_id=message.chat_id, text=u'Вы администратор!', reply_markup=MAIN_KEYBOARD_ADMIN) group_id = 'admin' elif message.text == NEWS_CMD: #news_message = get_news_message() if news == '': bot.sendMessage(chat_id=message.chat_id, text=u"Пока никаких новостей...", reply_markup=reply_markup) else: from_chat_id, message_id = map(int, news.split()) try: bot.forwardMessage(chat_id=message.chat_id, from_chat_id=from_chat_id, message_id=message_id) except telegram.TelegramError as error: print "TelegramError", error elif message.text == TEACHER_CMD: bot.sendMessage(chat_id=message.chat_id, text=TEACHER_TEXT, reply_markup=reply_markup) elif message.text == HOMEWORK_CMD: bot.sendMessage(chat_id=message.chat_id, text=HOMEWORK_TEXT, reply_markup=reply_markup) elif message.text == RESULTS_CMD: bot.sendMessage(chat_id=message.chat_id, text=RESULTS_TEXT, reply_markup=reply_markup) elif message.text == CARD_CMD: bot.sendMessage(chat_id=message.chat_id, text=u'Номер карты: 4276 5500 6960 1089, получатель: Климовская Динара Омирхановна. Сбербанк.\nПожалуйста, скиньте скрин платежа Яне (@yasaukova), как отправите перевод)', reply_markup=reply_markup) elif message.text == CHINESE_POD_CMD: bot.sendMessage(chat_id=message.chat_id, text=u'Доступ к Chinese Pod:\nlogin - [email protected]\npassword - lagou', reply_markup=reply_markup) elif message.text == STUFF_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Выберите материал:', reply_markup=reply_markup) state = 'STUFF_STATE' elif message.text == SCHEDULE_CMD: #bot.sendMessage(chat_id=message.chat_id, text="Расписание не установлено", reply_markup=reply_markup) #if group_id == "group1": # bot.sendMessage(chat_id=message.chat_id, text="Расписание не установлено", reply_markup=reply_markup) #elif group_id == "group2": # bot.sendMessage(chat_id=message.chat_id, text="Среда, с 19:30 до 20:00", reply_markup=reply_markup) #else: # schedule_message = get_schedule_message() # bot.sendMessage(chat_id=message.chat_id, text=schedule_message, reply_markup=reply_markup) schedule_message = get_schedule_message() bot.sendMessage(chat_id=message.chat_id, text=schedule_message, reply_markup=reply_markup) elif (group_id == "admin" or group_id == "teacher") and message.text == SEND_CMD: state = "SEND_STATE" reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format(NEWS_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Отослать новость?", reply_markup=reply_markup) elif ((group_id == "admin") or (group_id == 'teacher')) and message.text == USER_LIST_CMD: print_userlist(bot, message) elif ((group_id == "admin") or (group_id == 'teacher')) and message.text == GOOGLE_SHEET_CMD: bot.sendMessage(chat_id=message.chat_id, text=u'Ссылка на гуглшит: {}'.format(GOOGLE_SHEET), reply_markup=reply_markup) else: pass elif state.startswith("SEND_STATE"): if message.text == CANCEL_CMD: bot.sendMessage(chat_id=message.chat_id, text=u"Рассылка отменена", reply_markup=reply_markup) state = "MAIN_STATE" elif len(state.split()) == 1: if message.text == NEWS_CMD: state += " news" reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format(GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) elif message.text == HOMEWORK_CMD: state += " homework" reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format(GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) else: reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format(NEWS_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Отослать новость', reply_markup=reply_markup) elif len(state.split()) == 2: if message.text == GROUP1_CMD: state += " group1" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format(CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) elif message.text == GROUP2_CMD: state += " group2" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format(CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) elif message.text == ALL_CMD: state += " all" reply_markup = u'{{"keyboard" : [["{}"]], "resize_keyboard" : true}}'.format(CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Введите сообщение для рассылки (или файл/картинку):", reply_markup=reply_markup) else: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"]], "resize_keyboard" : true}}'.format(GROUP1_CMD, ALL_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Выберите группу для рассылки:", reply_markup=reply_markup) elif len(state.split()) == 3: state += " " + str(message.message_id) reply_markup = u'{{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}}'.format(CONFIRM_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text=u"Подтвердите отправку:", reply_markup=reply_markup) elif len(state.split()) == 4: if message.text == CONFIRM_CMD: _, _, group, message_id = state.split() forward_broad(bot, from_chat_id=message.chat_id, message_id=message_id, group=group) # Update news after broadcasting with db_session: chat = Chat.get(chat_id=message.chat.id) news = chat.news bot.sendMessage(chat_id=message.chat_id, text=u"Отправлено!", reply_markup=reply_markup) state = "MAIN_STATE" else: reply_markup = u'{"keyboard" : [["{}", "{}"]], "resize_keyboard" : true}'.format(CONFIRM_CMD, CANCEL_CMD) bot.sendMessage(chat_id=message.chat_id, text="Подтвердите отправку:", reply_markup=reply_markup) elif state.startswith('STUFF_STATE'): if message.text == STUFF_PIMSLER_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Пимслер -- https://yadi.sk/d/7E_5aVZLt5Nwf', reply_markup=reply_markup) elif message.text == STUFF_VIDEO_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Видео: \n https://yadi.sk/d/UZQt40fKtDLpW -- уровень 1\n https://yadi.sk/d/NvR0AXDhsM7iK -- уровень 2', reply_markup=reply_markup) elif message.text == STUFF_RESOURCES_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Ресурсы для обучения: busuu.com. Крутые приложения: memsrise, pleco, trainchinese', reply_markup=reply_markup) elif message.text == STUFF_BOOK_CMD: reply_markup = u'{{"keyboard" : [["{}", "{}", "{}"], ["{}", "{}"]], "resize_keyboard" : true}}'.\ format(STUFF_PIMSLER_CMD, STUFF_VIDEO_CMD, STUFF_RESOURCES_CMD, STUFF_BOOK_CMD, BACK_CMD) bot.sendMessage(chat_id=message.chat_id, text=u'Книга по ключам (https://vk.com/doc326978802_437453577?hash=0a34fc79dbdf96e3b8&dl=09475a5fd4ad299d57)', reply_markup=reply_markup) elif message.text == BACK_CMD: #reply_markup = MAIN_KEYBOARD_ADMIN if ((group_id == "admin") or (group_id == 'teacher')) else MAIN_KEYBOARD bot.sendMessage(chat_id=message.chat_id, text=u'Выберите команду:', reply_markup=reply_markup) state = 'MAIN_STATE' with db_session: chat = Chat.get(chat_id=message.chat.id) chat.primary_id, chat.group_id, chat.state, chat.silent_mode, chat.deleted, chat.realname, chat.news = \ primary_id, group_id, state, silent_mode, deleted, realname, news LAST_UPDATE_ID = update.update_id + 1