Esempio n. 1
0
def get_desc(update: Update, context: CallbackContext, mode="compose") -> int:
    query = update.callback_query
    query.answer()
    global kb
    global _
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "compose",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    if mode == "compose":
        logger.info(
            _("Пользователь {id} указывает описание нового опроса").format(
                id=update.effective_user.id))
        context.chat_data["current_step"] = "get_desc"
        context.chat_data["current_state"] = cc.GET_DESC_STATE
    elif mode == "edit":
        logger.info(
            _("Пользователь {id} редактирует описание опроса {title}").format(
                id=update.effective_user.id,
                title=context.chat_data["current_survey"]))
    query.edit_message_text(text=_(
        "Введите описание опроса.\nЭто описание будет отправляться перед опросом для ознакомления."
    ))
    return cc.GET_DESC_STATE
Esempio n. 2
0
def start(update: Update, context: CallbackContext) -> int:
    user = update.effective_user
    if "settings" not in context.user_data:
        context.bot.send_message(
            chat_id=update.effective_chat.id,
            text=f"{cc.CHOOSE_LANG}",
            reply_markup=kbs.LANG_KB,
        )
        return cc.LANG_STATE
    global _
    global kb
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    bcmd = bcmds.BotCommands(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "root",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]])
    locale.install()
    _ = locale.gettext
    context.bot.set_my_commands(bcmd.bot_commands)
    if update.callback_query is None:
        logging.info(_("Пользователь {id} запустил бота").format(id=user.id))
        context.bot.send_message(
            chat_id=update.effective_chat.id,
            text=_("Добро пожаловать, {name}!").format(name=user.first_name),
            reply_markup=kb.INITIAL_STATE_KB)
    else:
        query = update.callback_query
        query.answer()
        query.edit_message_text(
            text=_("Добро пожаловать, {name}!").format(name=user.first_name),
            reply_markup=kb.INITIAL_STATE_KB)
    return cc.START_STATE
Esempio n. 3
0
def get_multi(update: Update, context: CallbackContext, mode="compose") -> int:
    query = update.callback_query
    query.answer()
    global kb
    global _
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "compose",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    if mode == "compose":
        logger.info(
            _("Пользователь {id} решает, сколько вариантов ответа должно быть у вопроса №{num} нового опроса"
              ).format(
                  id=update.effective_user.id,
                  num=len(context.chat_data["current_survey"]["questions"]) +
                  1,
              ))
    elif mode == "edit":
        logger.info(
            _("Пользователь {id} решает, сколько вариантов ответа должно быть у вопроса №{num} опроса {title}"
              ).format(
                  id=update.effective_user.id,
                  num=context.chat_data["q_idx"] + 1,
                  title=context.chat_data["current_survey"]["title"],
              ))
    query.edit_message_text(
        text=_("У этого вопроса должно быть несколько вариантов ответа?"),
        reply_markup=kb.YES_NO_KB,
    )
    return cc.GET_MULTIANS_STATE
Esempio n. 4
0
def pick_survey(update: Update, context: CallbackContext) -> int:
    query = update.callback_query
    query.answer()
    global _
    global kb
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "poll",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]])
    locale.install()
    _ = locale.gettext
    if "poll_ongoing" not in context.bot_data:
        context.bot_data["poll_ongoing"] = False
    if not context.bot_data["poll_ongoing"]:
        if query.data != "PAGENUM":
            if len(context.bot_data[consts.SURVEYS_KEY]) > 0:
                survey_list = utils.num_list(
                    context.bot_data[consts.SURVEYS_KEY], key="title")
                multipage = context.user_data["settings"]["page_len"] < len(
                    context.bot_data[consts.SURVEYS_KEY])
                if multipage:
                    if "page" not in context.chat_data:
                        context.chat_data["page"] = 1
                    elif query.data == "prev page":
                        context.chat_data["page"] -= 1
                    elif query.data == "next page":
                        context.chat_data["page"] += 1
                else:
                    context.chat_data["page"] = None
                keyboard = kb.populate_keyboard(
                    page_len=context.user_data["settings"]["page_len"],
                    per_row=context.user_data["settings"]["row_len"],
                    length=len(context.bot_data[consts.SURVEYS_KEY]),
                    multipage=multipage,
                    page=context.chat_data["page"],
                )
                query.edit_message_text(
                    text=_("Выберите опрос из существующих\n\n"
                           "{list}").format(list=survey_list),
                    reply_markup=keyboard,
                )
                return cc.POLL_PICK_STATE
            else:
                query.edit_message_text(
                    text=_(
                        "В текущее время идёт опрос, подождите его завершения"
                    ),
                    reply_markup=kb.MAIN_MENU_KB,
                )
Esempio n. 5
0
def start(update: Update, context: CallbackContext) -> int:
    query = update.callback_query
    query.answer()
    global _
    global kb
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "manage",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]])
    locale.install()
    _ = locale.gettext
    query.edit_message_text(text=_("Выберите действие"),
                            reply_markup=kb.MANAGE_SURVEYS_KB)
    return cc.MANAGE_SURVEYS_STATE
Esempio n. 6
0
def get_question(update: Update,
                 context: CallbackContext,
                 mode="compose",
                 returning=False) -> int:
    query = update.callback_query
    query.answer()
    global kb
    global _
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "compose",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    if mode == "compose":
        if "questions" not in context.chat_data["current_survey"]:
            num = 0
        else:
            len(context.chat_data["current_survey"]["questions"]) + 1
        logger.info(
            _("Пользователь {id} указывает текст вопроса №{num} нового опроса"
              ).format(
                  id=update.effective_user.id,
                  num=num,
              ))
        context.chat_data["current_step"] = "get_question"
        context.chat_data["current_state"] = cc.GET_QUESTION_STATE
        if "questions" not in context.chat_data["current_survey"]:
            context.chat_data["current_survey"]["questions"] = []
        if returning:
            context.chat_data["current_survey"]["questions"].pop()
        query.edit_message_text(text=_("Введите текст вопроса №{num}").format(
            num=num + 1))
    elif mode == "edit":
        q_idx = context.chat_data["q_idx"]
        logger.info(
            _("Пользователь {id} редактирует текст вопроса №{num} опроса {title}"
              ).format(
                  id=update.effective_user.id,
                  num=q_idx + 1,
                  title=context.chat_data["current_survey"],
              ))
        query.edit_message_text(text=_("Введите текст вопроса №{num}").format(
            num=q_idx + 1))
    return cc.GET_QUESTION_STATE
Esempio n. 7
0
def pick(update: Update, context: CallbackContext) -> int:
    query = update.callback_query
    query.answer()
    global _
    global kb
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "settings",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    query.edit_message_text(
        text=_("Выберите настройку"),
        reply_markup=kb.SETTINGS_KB,
    )
    return cc.PICK_SETTING_STATE
Esempio n. 8
0
def pick_part(update: Update, context: CallbackContext, source=None) -> int:
    query = update.callback_query
    query.answer()
    global _
    global kb
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "edit",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]])
    locale.install()
    _ = locale.gettext
    context.chat_data.pop("page", None)
    if "s_idx" in context.chat_data:
        idx = context.chat_data["s_idx"]
        context.chat_data["current_survey"] = copy.deepcopy(
            context.bot_data[consts.SURVEYS_KEY][idx])
    if "base_ver" not in context.chat_data:
        context.chat_data["base_ver"] = copy.deepcopy(
            context.chat_data["current_survey"])
    if source == "compose":
        context.chat_data["edit_end"] = cc.END_COMPOSE
    elif source == "manage":
        context.chat_data["edit_end"] = cc.END_MANAGE
    if "base_ver" in context.chat_data:
        if context.chat_data["base_ver"] != context.chat_data["current_survey"]:
            changes = utils.surv_diff(
                context.chat_data["base_ver"],
                context.chat_data["current_survey"],
                context.user_data["settings"]["lang"],
            )
    else:
        changes = ""
    query.edit_message_text(
        text=_("Выбран опрос '{title}'\n\n").format(
            title=context.chat_data["current_survey"]["title"]) + changes +
        _("\nЧто вы хотите отредактировать?"),
        reply_markup=kb.PICK_PART_KB,
    )
    return cc.PICK_PART_STATE
Esempio n. 9
0
def get_answer(update: Update,
               context: CallbackContext,
               mode="compose",
               returning=False) -> int:
    query = update.callback_query
    query.answer()
    global kb
    global _
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "compose",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    if mode == "compose":
        context.chat_data["current_step"] = "get_answer"
        context.chat_data["current_state"] = cc.GET_ANSWER_STATE
        if "answers" not in context.chat_data["current_survey"]["questions"][
                -1]:
            context.chat_data["current_survey"]["questions"][-1][
                "answers"] = []
        if returning:
            context.chat_data["current_survey"]["questions"][-1][
                "answers"].pop()
        query.edit_message_text(
            text=_("Введите текст ответа №{a_num} к вопросу №{q_num}").format(
                a_num=len(context.chat_data["current_survey"]["questions"][-1]
                          ["answers"]) + 1,
                q_num=len(context.chat_data["current_survey"]["questions"]),
            ))
    elif mode == "edit":
        q_idx = context.chat_data["q_idx"]
        a_idx = context.chat_data["a_idx"]
        query.edit_message_text(
            text=_("Введите текст ответа №{a_num} к вопросу №{q_num}").format(
                a_num=a_idx + 1, q_num=q_idx + 1))
    return cc.GET_ANSWER_STATE
Esempio n. 10
0
def get_title(update: Update, context: CallbackContext, mode="compose") -> int:
    query = update.callback_query
    query.answer()
    global kb
    global _
    kb = kbs.Keyboards(context.user_data["settings"]["lang"])
    locale = gettext.translation(
        "compose",
        localedir="locales",
        languages=[context.user_data["settings"]["lang"]],
    )
    locale.install()
    _ = locale.gettext
    if mode == "compose":
        logger.info(
            _("Пользователь {id} указывает название нового опроса").format(
                id=update.effective_user.id))
        # if "current_survey" not in context.chat_data or query.data == cc.NO_CB:
        context.chat_data["current_survey"] = {"id": str(uuid4())}
        context.chat_data["current_step"] = "get_title"
        context.chat_data["current_state"] = cc.GET_TITLE_STATE

        # else:
        #     query.edit_message_text(
        #         text=_(
        #             "Обнаружен незавершённый опрос.\nХотите продолжить его создание?"
        #         ),
        #         reply_markup=kb.YES_NO_KB,
        #     )
    if mode == "edit":
        logger.info(
            _("Пользователь {id} редактирует название опроса {title}").format(
                id=update.effective_user.id,
                title=context.chat_data["current_survey"]))
    query.edit_message_text(text=_(
        "Введите краткое название опроса.\nЭто название будет отображаться в списке опросов при управлении или запуске опроса."
    ))
    return cc.GET_TITLE_STATE
Esempio n. 11
0
def set_lang(update: Update, context: CallbackContext, lang: str) -> None:
    query = update.callback_query
    query.answer()
    if "settings" not in context.user_data:
        context.user_data["settings"] = copy.deepcopy(
            context.bot_data[consts.DEFAULTS_KEY])
    context.user_data["settings"]["lang"] = lang
    try:
        global _
        global kb
        kb = kbs.Keyboards(context.user_data["settings"]["lang"])
        locale = gettext.translation(
            "commands",
            localedir="locales",
            languages=[context.user_data["settings"]["lang"]],
        )
        locale.install()
        _ = locale.gettext
    except ModuleNotFoundError:
        context.user_data["settings"]["lang"] = None
        logger.error("User {} picked an invalid language?".format(
            update.effective_user.id))
    root.start(update, context)
    return cc.START_STATE