示例#1
0
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()
示例#2
0
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("Неверный формат данных")
示例#3
0
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"]),
    )
示例#4
0
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(),
    )
示例#5
0
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(),
            )
示例#6
0
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())
示例#7
0
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))
示例#8
0
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("Привет!", )
示例#9
0
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(),
    )
示例#10
0
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
示例#11
0
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),
    )
示例#12
0
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,
        ),
    )
示例#13
0
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 "",
    )
示例#14
0
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)
示例#15
0
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)
示例#16
0
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)
示例#17
0
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)
示例#18
0
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)