@DokinsKING

Как интегрировать программу на python в telegram бота?

У меня есть программа эмулятор игральных кубиков, он там делает броски с различными гранями и т. д, но это не важно. Я хочу её интегрировать в Telegram бота. Я уже начал это делать, но столкнулся с проблемой. Я не могу в @bot.message_handler(content_types=['text']) сделать вычисления, а потом в @bot.callback_query_handler(func=lambda call: True) эти вычисления отправлять.

Я скину код, кто может наведите на верный путь

BOT телеграм

import config
import telebot
from telebot import types

bot = telebot.TeleBot(config.token)

@bot.message_handler(commands=['start'])
def welcome(message):


    #keyboard
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton('База данных')
    item2 = types.KeyboardButton('Генератор паролей')
    item3 = types.KeyboardButton('Эмулятор игральных кубиков')

    markup.add(item1,item2,item3)


    bot.send_message(message.chat.id,'Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>'.format(message.from_user,bot.get_me()),
                     parse_mode='html', reply_markup=markup)


@bot.message_handler(content_types=['text'])
def replayter(message):
    global hap
    if message.chat.type == 'private':
        if message.text == 'База данных':
            markup = types.InlineKeyboardMarkup(row_width=2)
            item1 = types.InlineKeyboardButton('Общий балл', callback_data='1')
            item2 = types.InlineKeyboardButton('Добавить учеников', callback_data='2')
            item3 = types.InlineKeyboardButton('Удалить ученика', callback_data='3')
            item4 = types.InlineKeyboardButton('Изменить данные ученика', callback_data='4')
            item5 = types.InlineKeyboardButton('Распечатать базу данных', callback_data='5')
            item6 = types.InlineKeyboardButton('Поиск по возрасту', callback_data='6')
            item7 = types.InlineKeyboardButton('Поиск по баллу', callback_data='7')
            markup.add(item1, item2, item3, item4, item5,item6,item7)
            bot.send_message(message.chat.id, 'Какую операцию Вы хотите выполнить?', reply_markup=markup)
        elif message.text == "Генератор поролей":
            markup = types.InlineKeyboardMarkup(row_width=2)
            item1 = types.InlineKeyboardButton('Сгенерировать', callback_data='8')
            markup.add(item1)
            bot.send_message(message.chat.id, 'Какую операцию Вы хотите выполнить?', reply_markup=markup)
        elif message.text == "Эмулятор игральных кубиков":
            global hap
            global results
            n = bot.send_message(message, 'Введите количество граней куба: '.format(message.from_user, bot.get_me()))
            z = bot.send_message(message.chat.id, 'Введите количество кубов: '.format(message.from_user, bot.get_me()))
            g = bot.send_message(message.chat.id,'Введите количество бросков: '.format(message.from_user, bot.get_me()))
            sp = [n,z,g]
            hap = []
            for i in range(sp[2]):
                hap.append([])
                for j in range(sp[1]):
                    d = randrange(1, sp[0] + 1)
                    hap[i].append(d)
            results = []
            for i in hap:
                results.append(sum(i))










            markup = types.InlineKeyboardMarkup(row_width=2)
            item1 = types.InlineKeyboardButton('Вывести результаты всех кубиков', callback_data='9')
            item2 = types.InlineKeyboardButton('Вывести результаты всех бросков', callback_data='10')
            item3 = types.InlineKeyboardButton('Вывести максимальную сумму', callback_data='11')
            item4 = types.InlineKeyboardButton('Вывести минимальную сумму', callback_data='12')
            item5 = types.InlineKeyboardButton('Увеличить результат броска', callback_data='13')

            markup.add(item1,item2,item3,item4,item5)
            bot.send_message(message.chat.id, 'Какую операцию Вы хотите выполнить?', reply_markup=markup)
        else:
            bot.send_message(message.chat.id, 'Я таких слов не знаю(')

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            if call.data == '1':
                pass
            elif call.data == '2':
                pass
            elif call.data == '3':
                pass
            elif call.data == '4':
                pass
            elif call.data == '5':
                pass
            elif call.data == '6':
                pass
            elif call.data == '7':
                pass
            elif call.data == '8':
                pass
            elif call.data == '9':
                bot.send_message(call.message.chat.id,str(*hap))
            elif call.data == '10':
                pass
            elif call.data == '11':
                pass
            elif call.data == '12':
                pass
            elif call.data == '13':
                pass

            bot.edit_message_text(chat_id= call.message.chat.id, message_id=call.message.message_id, text='База данных',reply_markup=None)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Генератор поролей',
                                  reply_markup=None)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Эмулятор игральных кубиков',
                                  reply_markup=None)

            bot.answer_callback_query(chat_id=call.message.chat.id, show_alert=True,text = 'Тест')
    except Exception as r:
        print(repr(r))


bot.polling(none_stop=True)


Программа,которую я хочу интегрировать

from random import randrange
# -*- coding: utf-8 -*-


def wyw():  #ввод данных
    n = int(input('Введите количество граней куба: '))
    z = int(input('Введите количество кубов: '))
    g = int(input('Введите количество бросков: '))
    return [n, z, g]


def f_results():   # результаты бросков
    global results
    results = []
    for i in hap:
        results.append(sum(i))
    return results


def act():    #генератор случайных бросков
    global hap
    sp = wyw()
    hap = []
    for i in range(sp[2]):
        hap.append([])
        for j in range(sp[1]):
            d = randrange(1, sp[0] + 1)
            hap[i].append(d)
    return hap


act()
f_results()
menu_commands ='Какую операцию Вы хотите выполнить?\n1) Вывести результаты всех кубиков\n2) Вывести результаты всех бросков\n3) Вывести максимальную сумму\n4) Вывести минимальную сумму\n5) Увеличить результат броска\n6) Уменьшить результат броска\n7) Вывести файл со значениями бросков\n8) Выйти из программы\nВведите номер операции: '
menu = int(input(menu_commands))


while 0<menu<8:
    if menu == 1:
        print(*hap)
        menu = int(input(menu_commands))

    if menu == 2:
        print(*results)
        menu = int(input(menu_commands))

    if menu == 3:
        def mx():  # максимальный результат
            return max(results)
        print(mx())
        menu = int(input(menu_commands))

    if menu == 4:
        def mn():  # минимальный результат
            return min(results)
        print(mn())
        menu = int(input(menu_commands))

    if menu == 5:
        def pribavit_k_brosku():
            pribav = int(input('Введите число, которое хотите прибавить: '))
            ind = int(input('К какому броску вы хотите прибавить? (введите числом): ')) - 1
            global results
            results[ind] = results[ind] + pribav
            return results
        print(*pribavit_k_brosku())
        menu = int(input(menu_commands))

    if menu == 6:
        def otnyat_ot_broska():
            vichet = int(input('Введите число, которое хотите отнять: '))
            ind = len(hap) + 1
            while ind >= len(hap):
                ind = int(input('Из какого броска вы хотите отнять? (введите числом): ')) - 1
            results[ind] = results[ind] - vichet
            return results
        print(*otnyat_ot_broska())
        menu = int(input(menu_commands))

    if menu == 7:
        def log():
            f = open('cubelog.txt', 'a+', encoding='utf-8')
            f.write(f'{str(hap)}\n\n')
            f.close()
        log()
        menu = int(input(menu_commands))

print('Программа завершена')
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Alexa2007
Во первых советую вам разделить бота на несколько файлов и избавиться от кучи elif. Потому что, когда вы уберете pass и напишете код это будет оооооочень длинный код. Во вторых: как вариант переписать класс бота дополнив своими методами, а инфа будет гоняться через self.
import telebot
import time
import threading
API_TOKEN = '11111111111111111111111111111111'
class my_bot(telebot.TeleBot):
    def loop_poop(self):
        while True:
            print(time.ctime())
            time.sleep(1)

    def start_action(self):
        thread = threading.Thread(target=self.loop_poop)
        thread.start()

bot = my_bot(token = API_TOKEN, threaded=False)

@bot.message_handler(commands=['start'])
def wellcome(message):
    if message.chat.type == 'private':
        bot.send_message(message.chat.id,'Hello')
bot.start_action()
bot.polling()

Но это я походу загнул. думаю вам необходимо на пальцах объяснить, что вы хотите сделать, потому как нифига не понятно
@bot.message_handler(content_types=['text']) сделать вычисления, а потом в @bot.callback_query_handler(func=lambda call: True) эти вычисления отправлять.

Допустим в @bot.message_handler(content_types=['text']) вы напишете х=2+2 затем в @bot.callback_query_handler(func=lambda call: True) необходимо сделать х+=2 и в консоли вы ждете 6. Я так понимаю... Если да то думаю проблема в логике... Такое возможно с использованием глобал, но прикол в том что эта глобал для всех пользователей и если три человека одновременно будут плюсовать, там будет *опа. Поэтому как вариант создавать 17854346.json для каждого пользователя и с каждым событием считывать данные
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы