def _end_request(self, event, custom_data=None): user = User.get(id=self.user) if custom_data is None: from_stp = event.kwargs.get('from_stp', False) message = event.kwargs.get('message') request = Request.get(id=user.additional_data.get('chat')) else: from_stp = custom_data.get('from_stp', False) message = custom_data.get('message') request = Request.get(id=custom_data.get('request')) request.is_finished = True request.save() if from_stp: self.tb.edit_message_text("Вы согласились закрыть заявку.", chat_id=self.chat, message_id=message) else: self.tb.edit_message_text("Вы закрыли данную заявку.", chat_id=self.chat, message_id=message) user_stp = request.stp.user if from_stp: self.tb.send_message(user_stp.telegram_chat_id, "Пользователь согласился закрыть заявку /r%s %s" % (request.id, request.unicode_icons)) else: self.tb.send_message(user_stp.telegram_chat_id, "Пользователь закрыл заявку /r%s %s" % (request.id, request.unicode_icons)) if user_stp.state == 'stp_chatting' and user_stp.additional_data.get('chat') == request.id: user_stp.state = 'stp_main_menu' user_stp.additional_data = {} user_stp.save() self.tb.send_message(user_stp.telegram_chat_id, "Сейчас вы будете переведены в главное меню", reply_markup=generate_custom_keyboard(types.ReplyKeyboardMarkup, [[get_button("Список запросов")], [get_button("Мои активные запросы")]]))
def is_user_online(self, user): chat = user.additional_data.get('chat') r = Request.get(id=chat) if r.user.additional_data.get('chat') == chat: self.tb.send_message(self.chat, "<code>Пользователь сейчас в этом чате</code>", parse_mode='HTML') else: self.tb.send_message(self.chat, "<code>Пользователь не в данном чате</code>", parse_mode='HTML')
def _is_taken(self, event): request = Request.get(id=event.kwargs.get('request')) stp = Stp.get(user=event.kwargs.get("user")) if request.stp is None or request.stp == stp: return True else: self.tb.send_message(self.chat, "Данная заявка уже взята.") return False
def send_to_chat_text(self, stp_user, message): r = Request.get(id=stp_user.additional_data['chat']) user = User.get(id=r.user) if 'chat' in user.additional_data and r.id == user.additional_data['chat']: Message(is_read=True, from_user=stp_user, to_user=user, text=message.text, request=r).save() self.tb.send_message(user.telegram_chat_id, "%s" % message.text) else: Message(is_read=False, from_user=stp_user, to_user=user, text=message.text, request=r).save()
def show_request(self, request_id, curr_user): try: r = Request.get(id=request_id) if r.user == curr_user: self.print_request(r) else: self.tb.send_message(self.chat, "Это не ваша заявка!") except: self.tb.send_message(self.chat, "Данная заявка не найдена")
def _drop_request(self, event): r = Request.get(id=event.kwargs.get('request')) self.tb.send_message(self.chat, "Вы хотите отключиться от заявки /r%s\nВы уверены? Так же вы можете добавить комментарий." % r.id, reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, buttons=[ [get_button_inline("Да", 'stp_request_drop_yes %s' % r.id), get_button_inline("Нет", 'stp_request_drop_no %s' % r.id)], [get_button_inline("Добавить комментарий к заявке\nи отключиться", "stp_request_drop_comment %s" % r.id)]]))
def drop_request_finally(self, message_id, request_id, user, decision, comment=None): if comment: self.tb.send_message(self.chat, "Вы добавили комментарий к заявке.(Пока не сохраняется в бд)") request_id = user.additional_data.get('request') r = Request.get(id=request_id) r.stp = None r.save() self.tb.send_message(self.chat, "Вы отключились от заявки /r%s." % request_id) else: if decision == 0: self.tb.edit_message_text("Вы остались подписаны на заявку /r%s." % request_id, chat_id=self.chat, message_id=message_id) else: r = Request.get(id=request_id) r.stp = None r.save() self.tb.edit_message_text("Вы отключились от заявки /r%s." % request_id, chat_id=self.chat, message_id=message_id)
def _request_active(self, event): r = Request.get(id=event.kwargs.get('chat')) message = message = event.kwargs.get('message') if r.is_finished: self.tb.edit_message_text(chat_id=self.chat, text="<code>Данная заявка уже решена.</code>", message_id=message, parse_mode='HTML') return False else: return True
def _keep_request(self, message, request=None, from_stp=False): if request and from_stp: r = Request.get(id=request) if r.stp is not None: user_stp = r.stp.user if user_stp.additional_data.get('chat', -1) == r.id: self.tb.send_message(user_stp.telegram_chat_id, "Пользователь оставил активной заявку") else: self.tb.send_message(user_stp.telegram_chat_id, "Пользователь оставил активной заявку /r%s %s" % (r.id, r.unicode_icons)) self.tb.edit_message_text("Ваша заявка актуальна.", chat_id=self.chat, message_id=message)
def take_request(self, request, user, call): stp = Stp.get(user=user) request = Request.get(id=request) if request.stp is None: request.stp = stp request.save() self.tb.edit_message_reply_markup(self.chat, message_id=call.message.message_id, reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, self.get_request_control_buttons( stp, request.id))) else: self.tb.send_message(self.chat, "Вы уже взяли заявку, либо ее взял кто-то другой /r%s." % request.id)
def show_request(self, request_id, curr_user, reply=None): try: r = Request.get(id=request_id) buttons = [] stp = Stp.get(Stp.user == curr_user) stp_sections = StpSection.select(StpSection.section).where(StpSection.stp == stp) is_suitable = Request.select().where(Request.section == r.section).where( Request.section << stp_sections).where(Request.is_finished == False).exists() if is_suitable: buttons = self.get_request_control_buttons(stp, request_id) self.print_request(r, keyboard=generate_custom_keyboard(types.InlineKeyboardMarkup, buttons), stp=stp) except: self.tb.send_message(self.chat, "Данная заявка не найдена")
def _confirm_end(self, user, request=None, message=None): if request is None: request = user.additional_data.get('chat') r = Request.get(id=request) if r.is_finished: if message: self.tb.edit_message_text(chat_id=self.chat, text="<code>Данная заявка уже решена.</code>", message_id=message, parse_mode='HTML') else: self.tb.send_message(self.chat, "вы уверены, что данная заявка решена?", reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, [ [get_button_inline("Да", "request_solved_yes %s" % r.id), get_button_inline("Нет", "request_solved_no %s" % r.id)]]))
def _select_chat(self, event): user = event.kwargs.get('user') message = event.kwargs.get('message') self.tb.edit_message_text(chat_id=self.chat, message_id=message, text="Вы выбрали данную заявку.") r = Request.get(id=event.kwargs.get('chat')) user.additional_data['chat'] = r.id user.save() self.tb.send_message(self.chat, "Вы были переключены в чат заявки /r%s %s" % (r.id, r.unicode_icons), reply_markup=generate_custom_keyboard(types.ReplyKeyboardMarkup, [[get_button("Показать историю сообщений")], [get_button("Заявка решена")], [get_button("Отключиться от чата")]])) self._show_unread_messages(r)
def _send_close_request(self, user): r = Request.get(id=user.additional_data.get('chat')) user_to_reiceve = r.user keyboard = generate_custom_keyboard(types.InlineKeyboardMarkup, [ [get_button_inline("Да", "request_close_accept %s" % r.id), get_button_inline("Нет", "request_close_decline %s" % r.id)]]) self.tb.send_message(user_to_reiceve.telegram_chat_id, "Тех. поддержка посчитала, что заявка /r%s:\nНомер: %s\nКатегория: %s\nТип: %s\nКомментарий: %s\nЗавершена, Вы согласны?" % ( str(r.id) + ' ' + r.unicode_icons, r.id, get_breadcrumb(r.type.section.id, Section, 'parent_section'), get_breadcrumb(r.type.id, Type, 'parent_type'), r.text, ), reply_markup=keyboard, parse_mode='HTML')
def get_request_control_buttons(self, stp, request_id): buttons = [] r = Request.get(id=request_id) if not r.stp == stp: buttons.append([get_button_inline(text="Взять", data="stp_request_take %s" % request_id), get_button_inline(text="Взять и начать чат", data="stp_request_take_and_chat %s" % request_id)]) else: buttons.append([get_button_inline(text="Начать чат", data="stp_request_chat %s" % request_id), get_button_inline(text="Отключиться от заявки", data="stp_request_dismiss_request %s" % request_id) ]) return buttons
def send_to_chat(self, text, user): try: r = Request.get(id=user.additional_data['chat']) if r.stp is not None: stp = User.get(id=Stp.get(id=r.stp).user) m = Message(from_user=user, to_user=stp.id, text=text, request=r) if 'chat' in stp.additional_data and stp.additional_data['chat'] == r.id: m.is_read = True self.tb.send_message(stp.telegram_chat_id, m.text) else: m = Message(from_user=user, to_user=None, text=text, request=r) m.save() except Exception as e: pass
def _set_chat(self, event): request = Request.get(id=event.kwargs.get('request')) user = event.kwargs.get("user") message = event.kwargs.get("message") stp = Stp.get(user=user) request.stp = stp request.save() user.additional_data['chat'] = request.id user.save() keyboard = generate_custom_keyboard(types.ReplyKeyboardMarkup, [[get_button("Показать историю чата")], [get_button("Закрыть заявку")], [get_button("Клиент в чате?")], [get_button("Отключиться от заявки")], [get_button("Отключиться от чата")]]) self.tb.edit_message_text(chat_id=self.chat, text="Вы переключились в чат заявки /r%s %s" % (request.id, request.unicode_icons), message_id=message) self.tb.send_message(self.chat, "имя клиента: %s\nФамилия клиента: %s\n" % (request.user.first_name, request.user.surname), reply_markup=keyboard) self._show_unread_messages(request)
def _show_request_history(self, request_id, page=0): r = Request.get(id=request_id) messages = Message.select().where(Message.request == request_id).offset(page * CHAT_PAGE_SIZE).limit( CHAT_PAGE_SIZE) req_len = len(messages) if req_len: for i in range(req_len): text = "<code>%s</code>\n%s" % ( "Вы" if r.user == messages[i].from_user else "Тех. поддежрка", messages[i].text) messages[i].is_read = True messages[i].save() if req_len == CHAT_PAGE_SIZE and req_len == i + 1: self.tb.send_message(self.chat, text, reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, [[get_button_inline( "Следующие %s сообщений" % CHAT_PAGE_SIZE, "next_chat_page %s" % (page + 1))]]), parse_mode='HTML') else: self.tb.send_message(self.chat, text, parse_mode='HTML') else: self.tb.send_message(self.chat, "Отображены все сообщения")
def _notify_user(data): text = "Для ваших заявок есть новые сообщения:\n" keyboard = generate_custom_keyboard( types.InlineKeyboardMarkup, [[get_button_inline("Мои заявки", "show_requests")]]) for user_id in data: user = User.get(id=user_id) if user.has_messages_after_notification: for chat in data[user_id]: request = Request.get() text += "Заявка /r%s:\nНомер: %s\n<b>Новых сообщений:" \ "%s</b>\nКатегория: %s\nТип: %s\nКомментарий: %s\n" % ( str(request.id) + ' ' + request.unicode_icons, request.id, chat['message_count'], get_breadcrumb(request.type.section.id, Section, 'parent_section'), get_breadcrumb(request.type.id, Type, 'parent_type'), request.text) tb.send_message(user.telegram_chat_id, text, reply_markup=keyboard, parse_mode='HTML') user.has_messages_after_notification = False user.save()