def call_prompt(admin_id: int) -> JSONStr: """ Генерирует клавиатуру с настройкой призыва. Args: admin_id: идентификатор администратора Returns: JSONStr: Клавиатура """ kb = kbs.common.prompt() kb.add_row() store = managers.AdminConfigManager(admin_id) if store.get_names_usage(): names_emoji = "✅" else: names_emoji = "🚫" chat_emoji = "📡" kb.add_text_button(text="◀️ Назад", payload={"button": "skip_call_message"}) kb.add_row() kb.add_text_button( text=f"{names_emoji} Использовать имена", payload={"button": "names_usage"}, ) kb.add_text_button( text=f"{chat_emoji} Переключить чат", payload={"button": "chat_config"}, ) return kb.get_keyboard()
async def _register_category(ans: bots.SimpleBotEvent): if re.match(r"^\w+ \d+$", ans.object.object.message.text): message = ans.object.object.message student_id = students.get_system_id_of_student(message.from_id) category = finances.get_or_create_finances_category( admin.get_active_group(student_id).id, *message.text.split(), ) admin_store = managers.AdminConfigManager(student_id) fin_store = managers.FinancialConfigManager(student_id) fin_store.update(financial_category=category.id) state_storage = managers.StateStorageManager(student_id) state_storage.update( state=state_storage.get_id_of_state("fin_send_alert"), ) with orm.db_session: chat_id = admin_store.get_active_chat().vk_id chat_title = await chat_utils.get_chat_name(api_context, chat_id) await ans.answer( "Категория {0} зарегистрирована. Вы можете отправить сообщение о начале сбора в чат {1}" .format( category.name, chat_title, ), keyboard=kbs.common.confirm_with_chat_update(), ) else: await ans.answer("Неверный формат данных")
async def _register_students(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student(ans.from_id) group = managers.AdminConfigManager(admin_id).get_active_group() students_ids = await redis.hget( "index:{0}".format(ans.from_id), "diff_vk_db", ) student_objects = await api_context.users.get( user_ids=students_ids.split(",")) with orm.db_session: for student in student_objects.response: models.Student( first_name=student.first_name, last_name=student.last_name, vk_id=student.id, group=group.id, academic_status=1, ) await ans.answer( "{0} студент(ов) зарегистрировано".format(len( student_objects.response)), keyboard=kbs.preferences.configure_chat(ans.payload["chat_id"]), )
async def _confirm_send_alarm(ans: bots.SimpleBotEvent): student_id = students.get_system_id_of_student(ans.from_id) admin_store = managers.AdminConfigManager(student_id) state_storage = managers.StateStorageManager(student_id) state_storage.update(state=state_storage.get_id_of_state("main")) fin_store = managers.FinancialConfigManager(student_id) with orm.db_session: chat_vk_id = admin_store.get_active_chat().vk_id category_name = fin_store.get_or_create().financial_category.name category_sum = fin_store.get_or_create().financial_category.summ await ans.api_ctx.messages.send( peer_id=chat_vk_id, random_id=0, message="Начат сбор средств на {0}. Сумма {1} руб.".format( category_name, category_sum, ), ) await ans.answer( "Сообщение отправлено", keyboard=kbs.finances.fin_prefs(), )
async def _call_debtors(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student(ans.from_id) group_id = admin.get_active_group(admin_id) state_store = managers.StateStorageManager(admin_id) admin_store = managers.AdminConfigManager(admin_id) fin_store = managers.FinancialConfigManager(admin_id) with orm.db_session: if chats.get_list_of_chats_by_group(group_id): category_id = fin_store.get_or_create().financial_category.id msgs = generate_debtors_call(category_id) state_store.update(state=state_store.get_id_of_state( "fin_confirm_debtors_call"), ) chat_id = admin_store.get_active_chat().vk_id chat_title = await chat_utils.get_chat_name(api_context, chat_id) for msg in msgs: await ans.answer(msg) if len(msgs) > 1: text = "Сообщения будут отправлены в {0}" else: text = "Сообщение будет отправлено в {0}" await ans.answer( text.format(chat_title), keyboard=kbs.common.confirm_with_chat_update(), ) else: await ans.answer( "У вашей группы нет зарегистрированных чатов. Возврат в главное меню", keyboard=kbs.finances.fin_category(), )
async def _confirm_call_debtors(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student(ans.from_id) admin_store = managers.AdminConfigManager(admin_id) state_store = managers.StateStorageManager(admin_id) fin_store = managers.FinancialConfigManager(admin_id) msgs = generate_debtors_call( fin_store.get_or_create().financial_category.id) with orm.db_session: chat = admin_store.get_active_chat().vk_id state_store.update(state=state_store.get_id_of_state("main")) for msg in msgs: await api_context.messages.send(peer_id=chat, message=msg, random_id=0) await ans.answer("Призыв отправлен", keyboard=kbs.finances.fin_category())
def generate_message(admin_id: int) -> str: """ Генерирует сообщение для призыва. Args: admin_id: Идентификатор пользователя, из хранилища которого провести генерацию Returns: str: Сообщение призыва """ mention_storage = managers.MentionStorageManager(admin_id) admin_storage = managers.AdminConfigManager(admin_id) message = mention_storage.get_text() or "" students = mention_storage.get_mentioned_students() or "" mentions = generate_mentions(admin_storage.get_names_usage(), students) return "\n".join((mentions, message))
async def _register_chat(ans: bots.SimpleBotEvent): confirm_message = await redis.hget( "register_chat:{0}".format(ans.from_id), "confirm_message", ) message = ans.object.object.message if confirm_message in message.text: admin_id = students.get_system_id_of_student(ans.from_id) state_store = managers.StateStorageManager(admin_id) admin_store = managers.AdminConfigManager(admin_id) state_store.update( state=state_store.get_id_of_state("pref_select_chat")) group = db.admin.get_active_group(admin_id, ) if db_chats.is_chat_registered(message.peer_id, group.id): await ans.api_ctx.messages.send( peer_id=message.from_id, message="Чат уже зарегистрирован в этой группе", keyboard=await kbs.preferences.connected_chats( api_context, students.get_system_id_of_student(message.from_id, ), ), random_id=0, ) else: chat = db_chats.register_chat(message.peer_id, group.id) admin_store.update(active_chat=chat.id) chat_name = await chats.get_chat_name(api_context, message.peer_id) await ans.api_ctx.messages.send( peer_id=message.from_id, message='Чат "{0}" зарегистрирован'.format(chat_name), keyboard=await kbs.preferences.connected_chats( api_context, admin_id, ), random_id=0, ) await ans.answer("Привет!", )
async def _offer_alert(ans: bots.SimpleBotEvent): student_id = students.get_system_id_of_student(ans.from_id) admin_store = managers.AdminConfigManager(student_id) state_storage = managers.StateStorageManager(student_id) fin_store = managers.FinancialConfigManager(student_id) state_storage.update( state=state_storage.get_id_of_state("fin_send_alert"), ) with orm.db_session: chat_id = admin_store.get_active_chat().vk_id category_name = fin_store.get_or_create().financial_category.name chat_title = await chat_utils.get_chat_name(api_context, chat_id) await ans.answer( "Сообщение о начале сбора на {0} будет отправлено в чат {1}".format( category_name, chat_title, ), keyboard=kbs.common.confirm_with_chat_update(), )
def get_active_group(admin_id: int) -> models.Group: """Получает выбранную группу администратора. Args: admin_id: идентификатор администратора Raises: UserIsNotAnAdmin: если указанный пользователь не является админом Returns: Group: объект группы """ active_group = managers.AdminConfigManager( admin_id).get_or_create().active_group if active_group is None: admin = models.Admin.get(student=admin_id) try: active_group = admin.group except AttributeError: raise UserIsNotAnAdmin( "Пользователь {0} не является админом".format(admin_id), ) return active_group
async def _send_call(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student( ans.object.object.message.peer_id) mention_storage = managers.MentionStorageManager(admin_id) admin_storage = managers.AdminConfigManager(admin_id) msg = call.generate_message(admin_id) bits = 64 with orm.db_session: chat_id = admin_storage.get_active_chat().vk_id await api_context.messages.send( peer_id=chat_id, message=msg, random_id=random.getrandbits(bits), attachment=mention_storage.get_attaches() or "", ) mention_storage.clear() await ans.answer( "Сообщение отправлено", keyboard=kbs.main.main_menu(admin_id), )
async def _delete_chat(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student( ans.object.object.message.from_id) admin_store = managers.AdminConfigManager(admin_id) db_chats.delete_chat(ans.payload["chat"]) with orm.db_session: student_id = db.students.get_system_id_of_student(ans.from_id) chat_objects = db_chats.get_list_of_chats_by_group( db.admin.get_active_group(student_id, ), )[:] try: chat_id = chat_objects[0].id except IndexError: chat_id = None admin_store.update(active_chat=chat_id) await ans.answer( "Чат удален", keyboard=await kbs.preferences.connected_chats( api_context, student_id, ), )
async def _confirm_call(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student( ans.object.object.message.peer_id) msg = call.generate_message(admin_id) admin_storage = managers.AdminConfigManager(admin_id) mention_storage = managers.MentionStorageManager(admin_id) state_storage = managers.StateStorageManager(admin_id) with orm.db_session: chat_id = admin_storage.get_active_chat().vk_id chat_name = await chats.get_chat_name(api_context, chat_id) if not msg and not mention_storage.get_attaches(): raise exceptions.EmptyCallMessage( "Сообщение призыва не может быть пустым") state_storage.update( state=state_storage.get_id_of_state("mention_confirm"), ) await ans.answer( 'Сообщение будет отправлено в чат "{0}":\n{1}'.format(chat_name, msg), keyboard=kbs.call.call_prompt(admin_id, ), attachment=mention_storage.get_attaches() or "", )
async def _change_chat(ans: bots.SimpleBotEvent): payload = ujson.loads(ans.object.object.message.payload) admin_storage = managers.AdminConfigManager( students.get_system_id_of_student(ans.object.object.message.from_id), ) admin_storage.update(active_chat=payload["chat_id"], ) await _confirm_call(ans)
async def _invert_names_usage(ans: bots.SimpleBotEvent): admin_storage = managers.AdminConfigManager( students.get_system_id_of_student(ans.object.object.message.from_id), ) admin_storage.invert_names_usage() await _confirm_call(ans)
async def _select_active_group(ans: bots.SimpleBotEvent): admin_store = managers.AdminConfigManager( students.get_system_id_of_student(ans.from_id), ) admin_store.update(active_group=ans.payload["group_id"]) await _open_preferences(ans)
async def _save_chat_debtors(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student(ans.from_id) admin_store = managers.AdminConfigManager(admin_id) admin_store.update(active_chat=ans.payload["chat_id"]) await _call_debtors(ans)
async def _send_alert_change_chat(ans: bots.SimpleBotEvent): admin_id = students.get_system_id_of_student(ans.from_id) admin_store = managers.AdminConfigManager(admin_id) admin_store.update(active_chat=ans.payload["chat_id"]) await _offer_alert(ans)