コード例 #1
0
def variable_message(message: telegram.Message,
                     assignment_list: List[Assignment]):
    send_text = ''
    for assignment in assignment_list:
        send_text += assignment.display(message.from_user.language_code) + '\n'
    send_message(message.chat_id, send_text, delete_after=40)
    delete_message(message.chat_id, message.message_id, 25)
コード例 #2
0
def handle_clear_variables(message: telegram.Message, player: Player, **_):
    _ = partial(get_by_user, user=message.from_user)
    player.variable_set.all().delete()
    send_text = _(
        Text.VARIABLE_CLEARED).format(character=player.character_name)
    send_message(message.chat_id, send_text, delete_after=20)
    delete_message(message.chat_id, message.message_id)
コード例 #3
0
ファイル: bot.py プロジェクト: zeteticl/PlayTRPGBot
def finish_gm_mode(message: telegram.Message, chat: Chat):
    _ = partial(get_by_user, user=message.from_user)
    if chat.gm_mode:
        if chat.gm_mode_notice:
            delete_message(chat.chat_id, chat.gm_mode_notice, 20)
        chat.gm_mode = False
        chat.gm_mode_notice = None
        chat.save()

    send_message(chat.chat_id, _(Text.FINISH_GM_MODE), delete_after=20)
    delete_message(message.chat_id, message.message_id)
コード例 #4
0
ファイル: bot.py プロジェクト: zeteticl/PlayTRPGBot
def handle_start(message: telegram.Message, **_kwargs):
    _ = partial(get_by_user, user=message.from_user)
    if not is_group_chat(message.chat):
        send_message(message.chat_id, _(Text.START_TEXT), reply_to=message.message_id)
        return
    chat = get_chat(message.chat)
    if not chat.recording:
        chat.recording = True
        chat.save()
        send_message(message.chat_id, '#start {}'.format(_(Text.START_RECORDING)))
    else:
        error_message(message, _(Text.ALREADY_STARTED))
コード例 #5
0
def handle_set_dice_face(message: telegram.Message, text: str, **_kwargs):
    _ = partial(get_by_user, user=message.from_user)
    chat = get_chat(message.chat)
    try:
        face = int(text.strip())
    except ValueError:
        return error_message(
            message,
            _(Text.SET_DEFAULT_FACE_SYNTAX).format(
                face=chat.default_dice_face))
    chat.default_dice_face = face
    chat.save()
    delete_message(message.chat_id, message.message_id)
    send_message(message.chat_id, _(Text.DEFAULT_FACE_SETTLED).format(face))
コード例 #6
0
def handle_list_variables(message: telegram.Message, name: str, player: Player,
                          **_):
    _ = partial(get_by_user, user=message.from_user)
    content = ''
    have_variable = False
    for variable in player.variable_set.order_by('updated').all():
        have_variable = True
        content += '<code>${}</code> {}\n'.format(variable.name,
                                                  variable.value)
    if not have_variable:
        content = _(Text.VARIABLE_LIST_EMPTY)

    send_text = '<b>{}</b>\n\n{}'.format(
        _(Text.VARIABLE_LIST_TITLE).format(character=name), content)
    send_message(message.chat_id, send_text, delete_after=30)
    delete_message(message.chat_id, message.message_id)
コード例 #7
0
ファイル: bot.py プロジェクト: zeteticl/PlayTRPGBot
def set_password(update, context: CallbackContext):
    message = update.message
    assert isinstance(message, telegram.Message)
    args = context.args
    _ = partial(get_by_user, user=message.from_user)

    if len(args) > 1:
        text = _(Text.PASSWORD_USAGE)
        return error_message(message, text)
    chat = get_chat(message.chat)
    if args:
        password = str(args[0])
        chat.password = sha256(password.encode()).hexdigest()
    else:
        chat.password = ''
    chat.save()
    send_message(message.chat_id, _(Text.PASSWORD_SUCCESS), message.message_id)
コード例 #8
0
def set_name(update: telegram.Update, context: CallbackContext):
    bot = context
    args = context.args
    message = update.message
    assert isinstance(message, telegram.Message)

    _ = partial(get_by_user, user=message.from_user)
    if len(args) == 0:
        return error_message(message, _(Text.NAME_SYNTAX_ERROR))
    user = message.from_user
    assert isinstance(user, telegram.User)
    name = ' '.join(args).strip()
    player = create_player(bot, message, name)
    if player.is_gm:
        template = _(Text.NAME_SUCCESS_GM)
    else:
        template = _(Text.NAME_SUCCESS)
    send_text = template.format(player=user.full_name, character=name)
    send_message(message.chat_id, send_text)
    delete_message(message.chat_id, message.message_id)
コード例 #9
0
ファイル: bot.py プロジェクト: zeteticl/PlayTRPGBot
def handle_message(update: telegram.Update, context: CallbackContext):
    bot = context .bot
    message: telegram.Message = update.message

    edit_log = None
    if update.edited_message:
        message = update.edited_message
        edit_log = Log.objects.filter(chat__chat_id=message.chat_id, source_message_id=message.message_id).first()
        cancel_delete_message(message.chat_id, message. message_id)
    elif not isinstance(message, telegram.Message):
        return
    elif not isinstance(message.from_user, telegram.User):
        return
    language_code: str = message.from_user.language_code

    def _(x: Text):
        return get(x, language_code)

    with_photo = get_maximum_photo(message)
    text = message.text
    if with_photo:
        text = message.caption

    if not isinstance(text, str):
        return
    # ignore ellipsis
    elif is_ellipsis(text):
        return

    if not is_group_chat(message.chat):
        message.reply_text(_(Text.NOT_GROUP))
        return

    chat = get_chat(message.chat)
    player = get_player_by_id(message.chat_id, message.from_user.id)

    # handle GM mode
    if player and player.is_gm and (is_start_gm_mode(text) or is_finish_gm_mode(text)):
        if is_start_gm_mode(text):
            start_gm_mode(bot, message, chat)
            if len(text.rstrip()) == 1:
                delete_message(message.chat_id, message.message_id)
                return
        elif is_finish_gm_mode(text):
            finish_gm_mode(message, chat)
            return
    # not start with . / 。, ignore
    elif not is_command(text):
        return

    # user hasn't set name
    if not player:
        error_message(message, _(Text.NOT_SET_NAME))
        return

    # in the GM mode
    if chat.gm_mode and not player.is_gm and not edit_log:
        if is_command(text):
            send_message(
                chat.chat_id,
                _(Text.PLAYER_IN_THE_GM_MODE),
                reply_to=message.message_id,
                delete_after=5
            )
        return

    name = player.character_name

    for pattern, handler in message_handlers:
        result = patterns.split(pattern, text)
        if not result:
            continue
        command, start = result
        rest = text[start:]
        if handler is not handle_as_say and edit_log:
            after_edit_delete_previous_message(edit_log.id)

        handler(
            bot=bot,
            chat=chat,
            player=player,
            command=command,
            start=start,
            name=name,
            text=rest,
            message=message,
            job_queue=context.job_queue,
            with_photo=with_photo,
            language_code=language_code,
            edit_log=edit_log,
            context=Context(bot, chat, player, command, name, start, rest, message,
                            context.job_queue, language_code, with_photo, edit_log)
        )
        return
    handle_say(chat, message, name, edit_log=edit_log, with_photo=with_photo, start=1)